diff --git a/combat.js b/combat.js
index b474651..db95ab0 100644
--- a/combat.js
+++ b/combat.js
@@ -34,10 +34,10 @@ function punchAttack(attacker) {
name: "Punch",
desc: "Punch a nerd",
attack: function(defender) {
- return "You punch the " + defender.description() + " for " + attack(attacker, defender, attacker.str) + " damage";
+ return "You punch " + defender.description("the") + " for " + attack(attacker, defender, attacker.str) + " damage";
},
attackPlayer: function(defender) {
- return "The " + attacker.description() + " punches you for " + attack(attacker, defender, attacker.str) + " damage";
+ return attacker.description("The") + " punches you for " + attack(attacker, defender, attacker.str) + " damage";
}, requirements: [
function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
],
@@ -51,10 +51,10 @@ function flankAttack(attacker) {
name: "Flank",
desc: "Be sneaky",
attack: function(defender) {
- return "You run around the " + defender.description() + " and attack for " + attack(attacker, defender, attacker.dex) + " damage";
+ return "You run around " + defender.description("the") + " and attack for " + attack(attacker, defender, attacker.dex) + " damage";
},
attackPlayer: function(defender) {
- return "The " + attacker.description() + " runs past you, then turns and hits you for " + attack(attacker, defender, attacker.str) + " damage";
+ return attacker.description("The") + " runs past you, then turns and hits you for " + attack(attacker, defender, attacker.str) + " damage";
}, requirements: [
function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
],
@@ -71,18 +71,18 @@ function grapple(attacker) {
let success = statHealthCheck(attacker, defender, "str");
if (success) {
defender.grappled = true;
- return "You charge at the " + defender.description() + ", tackling them and knocking them to the ground.";
+ return "You charge at " + defender.description("the") + ", tackling them and knocking them to the ground.";
} else {
- return "You charge at the " + defender.description() + ", but they dodge out of the way!";
+ return "You charge at " + defender.description("the") + ", but they dodge out of the way!";
}
},
attackPlayer: function(defender) {
let success = Math.random() < 0.5;
if (success) {
defender.grappled = true;
- return "The " + attacker.description() + " lunges at you, pinning you to the floor!";
+ return attacker.description("The") + " lunges at you, pinning you to the floor!";
} else {
- return "The " + attacker.description() + " tries to tackle you, but you deftly avoid them.";
+ return attacker.description("The") + " tries to tackle you, but you deftly avoid them.";
}
},
requirements: [
@@ -103,9 +103,9 @@ function grappleDevour(attacker) {
attacker.stomach.feed(defender);
defender.grappled = false;
changeMode("explore");
- return "You open your jaws wide, stuffing the " + defender.description() + "'s head into your gullet and greedily wolfing them down. Delicious.";
+ return "You open your jaws wide, stuffing " + defender.description("the") + "'s head into your gullet and greedily wolfing them down. Delicious.";
} else {
- return "Your jaws open wide, but the " + defender.description() + " manages to avoid becoming " + attacker.species + " chow.";
+ return "Your jaws open wide, but " + defender.description("the") + " manages to avoid becoming " + attacker.species + " chow.";
}
},
attackPlayer: function(defender) {
@@ -113,9 +113,9 @@ function grappleDevour(attacker) {
if(success) {
defender.grappled = false;
changeMode("eaten");
- return "The " + attacker.description() + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp.";
+ return attacker.description("The") + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp.";
} else {
- return "The " + attacker.description() + " 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: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
@@ -136,9 +136,9 @@ function grappleAnalVore(attacker) {
attacker.butt.feed(defender);
defender.grappled = false;
changeMode("explore");
- return "You shove the " + defender.description() + " between your cheeks. Their head slips into your ass with a wet shlk, and the rest of their body follows suit. You moan and gasp, working them deeper and deeper...";
+ return "You shove " + defender.description("the") + " between your cheeks. Their head slips into your ass with a wet shlk, and the rest of their body follows suit. You moan and gasp, working them deeper and deeper...";
} else {
- return "Your grasp and shove the " + defender.description() + ", 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: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
@@ -155,7 +155,7 @@ function grappleRelease(attacker) {
desc: "Release your opponent",
attack: function(defender) {
defender.grappled = false;
- return "You throw the " + defender.description() + " back, dealing " + attack(attacker, defender, attacker.str*1.5) + " damage";
+ return "You throw " + defender.description("the") + " back, dealing " + attack(attacker, defender, attacker.str*1.5) + " damage";
}, requirements: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
],
@@ -171,7 +171,7 @@ function grappledStruggle(attacker) {
let success = statHealthCheck(attacker, defender, "str");
if (success) {
attacker.grappled = false;
- return "You struggle and shove the " + defender.description() + " off of you.";
+ return "You struggle and shove " + defender.description("the") + " off of you.";
} else {
return "You struggle, but to no avail.";
}
@@ -201,7 +201,7 @@ function grappledReverse(attacker) {
if (success) {
attacker.grappled = false;
defender.grappled = true;
- return "You surprise the " + defender.description() + " with a burst of strength, flipping them over and pinning them.";
+ return "You surprise " + defender.description("the") + " with a burst of strength, flipping them over and pinning them.";
} else {
return "You try to throw your opponent off of you, but fail.";
}
@@ -250,7 +250,7 @@ function pass(attacker) {
return "You do nothing.";
},
attackPlayer: function(defender) {
- return "The " + attacker.description() + " does nothing.";
+ return attacker.description("The") + " does nothing.";
},
priority: 0,
};
@@ -280,7 +280,7 @@ function leer(attacker) {
desc: "Leer at something",
attackPlayer: function(defender) {
attacker.leering = true;
- return "The " + attacker.description() + " leers at you.";
+ return attacker.description("The") + " leers at you.";
},
requirements: [
function(attacker, defender) { return attacker.leering != true && attacker.grappled != true; }
@@ -294,7 +294,7 @@ function poke(attacker) {
name: "Poke",
desc: "Poke a nerd",
attackPlayer: function(defender) {
- return "The " + attacker.description() + " pokes you on the snout for " + attack(attacker, defender, 1e12) + " damage";
+ return attacker.description("The") + " pokes you on the snout for " + attack(attacker, defender, 1e12) + " damage";
},
priority: 1,
};
@@ -304,7 +304,7 @@ function digestPlayerStomach(predator,damage=20) {
return {
digest: function(player) {
attack(predator, player, damage);
- return "The " + predator.description() + "'s stomach grinds over your body, swiftly digesting you.";
+ return predator.description("The") + "'s stomach grinds over your body, swiftly digesting you.";
},
priority: 1,
};
diff --git a/customs.js b/customs.js
new file mode 100644
index 0000000..6b5db73
--- /dev/null
+++ b/customs.js
@@ -0,0 +1,41 @@
+/* AEZNON COMMISSION */
+
+function Geta() {
+ Creature.call(this, "Geta", 5, 15, 10);
+
+ this.hasName = true;
+
+ this.description = function() { return "Geta" };
+}
+
+function GetaObj() {
+ GameObject.call(this, "Geta");
+ this.actions.push( {
+ "name": "Approach Geta",
+ "action": function() {
+ startDialog(new GetaDialog());
+ }
+ });
+}
+
+function GetaDialog() {
+ DialogNode.call(this);
+
+ this.text = "You approach the sandy-furred fox.";
+
+ {
+ let nodeFight = new DialogNode();
+ this.addChoice("He certainly looks tasty...", nodeFight);
+
+ nodeFight.text = "You stalk up to your prey, but he sees you coming. You're going to have to fight!";
+ nodeFight.hooks.push( function(){
+ currentFoe = new Geta();
+ changeMode("combat");
+ });
+ }
+
+ {
+ let nodeIgnore = new DialogNode();
+ this.addChoice("Leave him be", nodeIgnore);
+ }
+}
diff --git a/dialog.js b/dialog.js
index 5139577..0665334 100644
--- a/dialog.js
+++ b/dialog.js
@@ -21,7 +21,7 @@ function EatDude() {
let nerd = new Anthro();
- this.text = "You approach the " + nerd.description();
+ this.text = "You approach " + nerd.description("the");
let eatHim = new DialogNode();
diff --git a/feast.html b/feast.html
index c484828..eb5c354 100644
--- a/feast.html
+++ b/feast.html
@@ -8,6 +8,7 @@
+
diff --git a/feast.js b/feast.js
index d22aa96..a111371 100644
--- a/feast.js
+++ b/feast.js
@@ -23,13 +23,13 @@ let prefs = {
function join(things) {
if (things.length == 1) {
- return "a " + things[0].description();
+ return things[0].description("a");
} else if (things.length == 2) {
- return "a " + things[0].description() + " and a " + things[1].description();
+ return things[0].description("a") + " and " + things[1].description("a");
} else {
let line = "";
- line = things.slice(0,-1).reduce((line, prey) => line + "a " + prey.description() + ", ", line);
- line += " and a " + things[things.length-1].description();
+ line = things.slice(0,-1).reduce((line, prey) => line + prey.description("a") + ", ", line);
+ line += " and " + things[things.length-1].description("a");
return line;
}
}
@@ -375,14 +375,14 @@ function respawn(respawnRoom) {
function startCombat(opponent) {
currentFoe = opponent;
changeMode("combat");
- update(["Oh shit it's a " + opponent.description()]);
+ update(["Oh shit it's " + opponent.description("a")]);
}
function attackClicked(index) {
update([playerAttacks[index].attack(currentFoe)]);
if (currentFoe.health <= 0) {
- update(["The " + currentFoe.description() + " falls to the ground!"]);
+ update([currentFoe.description("The") + " falls to the ground!"]);
startDialog(new FallenFoe(currentFoe));
} else if (mode == "combat") {
let attack = pick(filterPriority(filterValid(currentFoe.attacks, currentFoe, player)), currentFoe, player);
@@ -427,7 +427,7 @@ function struggleClicked(index) {
update([digest.digest(player)]);
if (player.health <= -100) {
- update(["You digest in the depths of the " + currentFoe.description()]);
+ update(["You digest in the depths of " + currentFoe.description("the")]);
respawn(respawnRoom);
}
}
@@ -449,7 +449,7 @@ function dialogClicked(index) {
currentDialog = currentDialog.choices[index].node;
update([currentDialog.text]);
currentDialog.visit();
- if (currentDialog.choices.length == 0) {
+ if (currentDialog.choices.length == 0 && mode == "dialog") {
changeMode("explore");
updateDisplay();
}
diff --git a/vore.js b/vore.js
index ff90f7e..d6c21fa 100644
--- a/vore.js
+++ b/vore.js
@@ -13,6 +13,8 @@ function Creature(name = "Creature", str=10, dex=10, con=10) {
this.dex = dex;
this.con = con;
+ this.hasName = false;
+
Object.defineProperty(this, "maxHealth", {get: function() { return this.str * 5 + this.con * 10 }});
this.health = this.maxHealth;
Object.defineProperty(this, "maxStamina", {get: function() { return this.dex * 5 + this.con * 10 }});
@@ -80,11 +82,20 @@ function Anthro(name="Anthro") {
}
this.species = pickRandom(["dog","cat","lizard","deer","wolf","fox"]);
- this.description = function() {
+
+ // todo better lol
+
+ this.description = function(prefix="") {
if (this.build == "")
- return this.species;
+ if (prefix == "")
+ return this.species;
+ else
+ return prefix + " " + this.species;
else
- return this.build + " " + this.species;
+ if (prefix == "")
+ return this.build + " " + this.species;
+ else
+ return prefix + " " + this.build + " " + this.species;
};
this.attacks.push(new punchAttack(this));
@@ -215,15 +226,15 @@ class Stomach extends Container {
}
describeDamage(prey) {
- return "Your guts gurgle and churn, slowly wearing down the " + prey.description() + " trapped within.";
+ return "Your guts gurgle and churn, slowly wearing down " + prey.description("the") + " trapped within.";
}
describeKill(prey) {
- return "The " + prey.description() + "'s struggles wane as your stomach overpowers them.";
+ return prey.description("The") + "'s struggles wane as your stomach overpowers them.";
}
describeFinish(prey) {
- return "Your churning guts have reduced a " + prey.description() + " to meaty chyme.";
+ return "Your churning guts have reduced " + prey.description("a") + " to meaty chyme.";
}
fill(amount) {
@@ -253,7 +264,7 @@ class Butt extends Container {
pushed.forEach(function(x) {
this.stomach.feed(x);
- lines.push("Your winding guts squeeze the " + x.description() + " into your stomach.");
+ lines.push("Your winding guts squeeze " + x.description("the") + " into your stomach.");
},this);
this.contents = this.contents.filter(prey => prey.timeInButt < 60 * 30);
@@ -262,11 +273,11 @@ class Butt extends Container {
}
describeDamage(prey) {
- return "Your bowels gurgle and squeeze, working to wear down the " + prey.description() + " trapped in those musky confines.";
+ return "Your bowels gurgle and squeeze, working to wear down " + prey.description("the") + " trapped in those musky confines.";
}
describeKill(prey) {
- return "The " + prey.description() + " abruptly stops struggling, overpowered by your winding intestines.";
+ return prey.description("The") + " abruptly stops struggling, overpowered by your winding intestines.";
}
describeFinish(prey) {
@@ -319,12 +330,12 @@ function plead(predator) {
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"]
+ "lines": ["You plead for " + predator.description("the") + " 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."]
+ "lines": ["You plead with " + predator.description("the") + " to let you go, but they refuse."]
};
}
}
@@ -341,12 +352,12 @@ function struggle(predator) {
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."]
+ "lines": ["You struggle and squirm, forcing " + predator.description("the") + " 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."]
+ "lines": ["You squirm and writhe within " + predator.description("the") + " to no avail."]
};
}
}
@@ -360,7 +371,7 @@ function rub(predator) {
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."]
+ "lines": ["You rub the walls of your predator's belly. At least " + predator.description("the") + " is getting something out of this."]
};
}
};
diff --git a/world.js b/world.js
index 06c91f7..3d4ed90 100644
--- a/world.js
+++ b/world.js
@@ -169,7 +169,8 @@ let locationsSrc = [
}
],
"objs": [
- NatureTrailExercise
+ NatureTrailExercise,
+ GetaObj
]
},
{