From 543b9e2ff8d8660f6fd7c4f03676815691643b76 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Sat, 10 Mar 2018 18:25:58 -0500 Subject: [PATCH] Got some basic player-prey mechanics going --- combat.js | 11 ++++++++ feast.css | 11 ++++++++ feast.html | 10 +++++-- feast.js | 76 +++++++++++++++++++++++++++++++++++++++++++-------- vore.js | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ world.js | 21 +++++++++++++++ 6 files changed, 195 insertions(+), 13 deletions(-) diff --git a/combat.js b/combat.js index 015998d..cd24424 100644 --- a/combat.js +++ b/combat.js @@ -31,3 +31,14 @@ function flankAttack(attacker) { } }; } + +function devourPlayer(attacker) { + return { + name: "Devours YOU!", + desc: "You won't see this", + attackPlayer: function(defender) { + changeMode("eaten"); + return "The voracious " + attacker.description() + " pins you down and devours you in seconds."; + } + } +} diff --git a/feast.css b/feast.css index 630aae9..7d856da 100644 --- a/feast.css +++ b/feast.css @@ -56,6 +56,13 @@ button { user-select: none; } +.eaten-button { + width: 200px; + height: 50px; + font-size: 18px; + user-select: none; +} + #combat-desc { width: 200px; height: 400px; @@ -77,6 +84,10 @@ button { list-style-type: none; } +#eaten { + list-style-type: none; +} + #log { background: #222; width: 100%; diff --git a/feast.html b/feast.html index 05397d6..79601f4 100644 --- a/feast.html +++ b/feast.html @@ -1,4 +1,4 @@ - +0.0.2 @@ -23,7 +23,7 @@
- Welcome to Feast v0.0.1 + Welcome to Feast v0.0.2
Time: to get a watch
@@ -115,6 +115,12 @@
+
+
    +
+
+
+
    diff --git a/feast.js b/feast.js index 72b2528..12070cc 100644 --- a/feast.js +++ b/feast.js @@ -1,3 +1,4 @@ + let currentRoom = null; let currentDialog = null; @@ -11,6 +12,8 @@ let newline = " "; let player = new Player(); +let respawnRoom; + function round(number, digits) { return Math.round(number * Math.pow(10,digits)) / Math.pow(10,digits); } @@ -53,6 +56,25 @@ function updateExplore() { updateExploreActions(); } +function updateEaten() { + let list = document.getElementById("eaten"); + + while(list.firstChild) { + list.removeChild(list.firstChild); + } + + for (let i = 0; i < currentFoe.struggles.length; i++) { + let li = document.createElement("li"); + let button = document.createElement("button"); + button.classList.add("eaten-button"); + button.innerHTML = currentFoe.struggles[i].name; + button.addEventListener("click", function() { struggleClicked(i); } ); + button.addEventListener("mouseover", function() { struggleHovered(i); } ); + li.appendChild(button); + list.appendChild(li); + } + +} function updateCombat() { let list = document.getElementById("combat"); @@ -91,25 +113,27 @@ function updateDialog() { } function updateDisplay() { + + document.querySelectorAll(".selector").forEach(function (x) { + x.style.display = "none"; + }); switch(mode) { case "explore": document.getElementById("selector-explore").style.display = "flex"; - document.getElementById("selector-combat").style.display = "none"; - document.getElementById("selector-dialog").style.display = "none"; updateExplore(); break; case "combat": - document.getElementById("selector-explore").style.display = "none"; document.getElementById("selector-combat").style.display = "flex"; - document.getElementById("selector-dialog").style.display = "none"; updateCombat(); break; case "dialog": - document.getElementById("selector-explore").style.display = "none"; - document.getElementById("selector-combat").style.display = "none"; document.getElementById("selector-dialog").style.display = "flex"; updateDialog(); break; + case "eaten": + document.getElementById("selector-eaten").style.display = "flex"; + updateEaten(); + break; } document.getElementById("time").innerHTML = "Time: " + renderTime(time); @@ -166,6 +190,7 @@ window.addEventListener('load', function(event) { loadCompass(); loadDialog(); currentRoom = createWorld(); + respawnRoom = currentRoom; moveTo(currentRoom); updateDisplay(); }); @@ -182,8 +207,8 @@ function update(lines=[]) { updateDisplay(); } -function changeMode(mode) { - this.mode = mode; +function changeMode(newMode) { + mode = newMode; let body = document.querySelector("body"); body.className = ""; switch(mode) { @@ -198,9 +223,11 @@ function changeMode(mode) { body.classList.add("eaten"); break; } + + updateDisplay(); } function startCombat(opponent) { - mode = "combat"; + changeMode("combat"); currentFoe = opponent; update(["Oh shit it's a " + opponent.description()]); } @@ -219,6 +246,7 @@ function attackClicked(index) { if (player.health <= 0) { update(["You fall to the ground..."]); changeMode("eaten"); + updateDisplay(); } } } @@ -227,8 +255,34 @@ function attackHovered(index) { document.getElementById("combat-desc").innerHTML = player.attacks[index].desc; } +function struggleClicked(index) { + let struggle = currentFoe.struggles[index]; + + let result = struggle.struggle(player); + + update([result.lines]); + + if (result.escape) { + changeMode("explore"); + } else { + player.health -= 20; + + if (player.health <= -100) { + update(["You digest in the depths of the " + currentFoe.description()]); + moveTo(respawnRoom); + changeMode("explore"); + player.health = 100; + update(["You wake back up in your bed."]); + } + } +} + +function struggleHovered(index) { + document.getElementById("eaten-desc").innerHTML = player.struggles[index].desc; +} + function startDialog(dialog) { - mode = "dialog"; + changeMode("dialog"); currentDialog = dialog; update([currentDialog.text]); currentDialog.visit(); @@ -240,7 +294,7 @@ function dialogClicked(index) { update([currentDialog.text]); currentDialog.visit(); if (currentDialog.choices.length == 0) { - mode = "explore"; + changeMode("explore"); updateDisplay(); } } diff --git a/vore.js b/vore.js index 4afa060..78068d2 100644 --- a/vore.js +++ b/vore.js @@ -46,6 +46,26 @@ function Anthro() { this.attacks.push(new punchAttack(this)); this.attacks.push(new flankAttack(this)); + + this.struggles = []; + + this.struggles.push(new plead(this)); + this.struggles.push(new struggle(this)); +} + +function Fen() { + Anthro.call(this, name); + + this.build = "loomy"; + this.species = "crux"; + + this.attacks = []; + + this.attacks.push(new devourPlayer(this)); + + this.struggles = []; + + this.struggles.push(new rub(this)); } function Micro() { @@ -208,3 +228,62 @@ function WasteContainer(name) { function Bowels() { WasteContainer.call(this, "Bowels"); } + +// PLAYER PREY + +function plead(predator) { + return { + name: "Plead", + desc: "Ask very, very nicely for the predator to let you go. More effective if you haven't hurt your predator.", + struggle: function(player) { + let escape = Math.random() < predator.health / predator.maxHealth; + + if (escape) { + return { + "escape": escape, + "lines": ["You plead for the " + predator.description() + " to let you free, and they begrudingly agree, horking you up and leaving you shivering on the ground"] + }; + } else { + return { + "escape": escape, + "lines": ["You plead with the " + predator.description() + " to let you go, but they refuse."] + }; + } + } + }; +} + +function struggle(predator) { + return { + name: "Struggle", + desc: "Try to squirm free. More effective if you've hurt your predator.", + struggle: function(player) { + let escape = Math.random() > predator.health / predator.maxHealth; + + if (escape) { + return { + "escape": escape, + "lines": ["You struggle and squirm, forcing the " + predator.description() + " to hork you up. They groan and stumble away, exhausted by your efforts."] + }; + } else { + return { + "escape": escape, + "lines": ["You squirm and writhe within the " + predator.description() + " to no avail."] + }; + } + } + }; +} + +function rub(predator) { + return { + name: "Rub", + desc: "Rub rub rub", + struggle: function(player) { + return { + "escape": false, + "lines": ["You rub the walls of your predator's belly. At least the " + predator.description() + " is getting something out of this."] + }; + } + }; +} diff --git a/world.js b/world.js index 0105646..882d3eb 100644 --- a/world.js +++ b/world.js @@ -161,6 +161,11 @@ let locationsSrc = [ "name": "North Street", "dir": SOUTH, "desc": "You walk out of the DANGER ZONE" + }, + { + "name": "SUPER DANGER ZONE", + "dir": NORTH, + "desc": "Getting eaten is fun!" } ], "hooks": [ @@ -168,6 +173,22 @@ let locationsSrc = [ startCombat(new Anthro()); } ] + }, + { + "name": "SUPER DANGER ZONE", + "desc": "Very dangerous", + "conn": [ + { + "name": "DANGER ZONE", + "dir": SOUTH, + "desc": "You hurriedly leave the SUPER DANGER ZONE" + } + ], + "hooks": [ + function() { + startCombat(new Fen()); + } + ] } ];