diff --git a/combat.js b/combat.js index 14a3666..419b151 100644 --- a/combat.js +++ b/combat.js @@ -165,7 +165,8 @@ function grappleDevour(attacker) { }, requirements: [ function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 1, weight: function(attacker, defender) { return 1 - defender.health / defender.maxHealth; } @@ -189,7 +190,8 @@ function grappledDevour(attacker) { }, requirements: [ function(attacker, defender) { return isGrappled(attacker) && isNormal(defender) && attacker.flags.shrunk != true; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 1, }; @@ -217,7 +219,8 @@ function grappleAnalVore(attacker) { }, requirements: [ function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true ; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey && defender.prefs.analVore; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.anal > 0; } ], priority: 1, }; @@ -307,7 +310,7 @@ function grappledReverse(attacker) { }, requirements: [ function(attacker, defender) { return isGrappled(attacker) && isNormalSize(attacker) && isNormal(defender); }, - function(attacker, defender) { return defender.flags.grapple; } + function(attacker, defender) { return attacker.flags.grappled; } ], priority: 1, }; @@ -350,6 +353,9 @@ function shrunkSwallow(attacker) { function(attacker, defender) { return isNormal(attacker) && defender.flags.grappled == true && defender.flags.shrunk == true; } + ], conditions: [ + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 2 }; @@ -412,18 +418,16 @@ function pass(attacker) { function devourPlayer(attacker) { return { - name: "Devours YOU!", - desc: "You won't see this", - conditions: [ - function(attacker, defender) { return defender.prefs.prey; } - ], requirements: [ function(attacker, defender) { return attacker.leering == true; } ], attackPlayer: function(defender) { changeMode("eaten"); return ["The voracious " + attacker.description() + " pins you down, his slimy maw spreading wide and engulfing your upper body with ease. He swallows and shoves you deeper, cramming your succulent frame into churning, crushing depths in seconds. A lazy, drawn-out belch escapes his gullet, his hunger briefly sated...and your existence now in inescapable peril."]; - }, + }, conditions: [ + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } + ], priority: 1, }; } diff --git a/customs.js b/customs.js index cf4b009..7316252 100644 --- a/customs.js +++ b/customs.js @@ -28,7 +28,7 @@ function Geta() { this.struggles.push(new rub(this)); this.prefs.scat = false; - this.prefs.analVore = false; + this.prefs.vore.anal = 0; } function getaShrink(attacker) { @@ -227,6 +227,8 @@ function Trance() { this.attacks.push(new grappleSubdue(this)); this.attacks.push(new tranceGrappleMaul(this)); this.attacks.push(new tranceGrappleThroat(this)); + this.attacks.push(new tranceGrappleConsume(this)); + this.attacks.push(new tranceGrappleKill(this)); this.attacks.push(new grappledReverse(this)); this.attacks.push(new grappledDevour(this)); @@ -329,10 +331,11 @@ function tranceGrappleDevour(attacker) { }, requirements: [ function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 1, - weight: function(attacker, defender) { return 3 - 2 * defender.health / defender.maxHealth; } + weight: function(attacker, defender) { return (defender.prefs.vore.oral) * (3 - 2 * defender.health / defender.maxHealth); } }; } @@ -359,6 +362,56 @@ function tranceGrappleMaul(attacker) { }; } +function tranceGrappleConsume(attacker) { + return { + attackPlayer: function(defender) { + defender.health = -100; + return ["The sergal sets about consuming your broken body, ripping you apart like deli meat as he sates his hunger. You are dead. Dead, dead, dead."]; + }, + requirements: [ + function(attacker, defender) { + return isNormal(attacker) && isGrappled(defender); + }, + function(attacker, defender) { + return defender.stamina <= 0 && defender.health <= 0; + } + ], + conditions: [ + function(attacker, defender) { + return defender.prefs.vore.hard > 0; + } + ], + priority: 3, + weight: function(attacker, defender) { return defender.prefs.vore.hard; }, + gameover: function() { return "Ripped apart and devoured by Trance"; } + }; +} + +function tranceGrappleKill(attacker) { + return { + attackPlayer: function(defender) { + defender.health = -100; + return ["You're too tired to fight back as Trance's powerful hands grip your head, wrenching it to the side and snapping your neck like a twig - moments before his crushing jaws clamp down around your skull and crush it, killing you instantly."]; + }, + requirements: [ + function(attacker, defender) { + return isNormal(attacker) && isGrappled(defender); + }, + function(attacker, defender) { + return defender.stamina <= 0; + } + ], + conditions: [ + function(attacker, defender) { + return defender.prefs.vore.hard > 0; + } + ], + priority: 2, + weight: function(attacker, defender) { return defender.prefs.vore.hard; }, + gameover: function() { return "Ripped apart and devoured by Trance"; } + }; +} + function tranceGrappleThroat(attacker) { return { attackPlayer: function(defender) { @@ -540,10 +593,11 @@ function taluthusGrabDevour(attacker) { function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; }, function(attacker, defender) { return attacker.flags.grappleType == "hands"; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return defender.prefs.vore.oral; } }; } @@ -569,10 +623,10 @@ function taluthusGrabCockVore(attacker) { function(attacker, defender) { return attacker.flags.grappleType == "hands"; } ], conditions: [ function(attacker, defender) { return defender.prefs.prey; }, - function(attacker, defender) { return defender.prefs.vore.cock; } + function(attacker, defender) { return defender.prefs.vore.cock > 0; } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return defender.prefs.vore.cock; } }; } @@ -598,7 +652,7 @@ function taluthusTailDevour(attacker) { function(attacker, defender) { return isNormal(attacker) && isNormal(defender); } ], priority: 1, - weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; } + weight: function(attacker, defender) { return (7 - 6 * defender.health / defender.maxHealth) * defender.prefs.vore.tail; } }; } @@ -897,8 +951,8 @@ function Selicia() { this.defeated = function() { player.cash += 500; changeMode("explore"); moveToByName("Nature Trail"); update(["The dragoness yelps as you land your last blow, turning tail and darting away into the forest. You duck into her cave, finding a whole pile of wallets. Score!"]); }; this.prefs.scat = false; - this.prefs.analVore = false; this.prefs.prey = false; + this.attacks = []; this.attacks.push(seliciaBite(this)); @@ -1016,7 +1070,7 @@ function seliciaTailUnbirth(attacker) { }, conditions: [ function(attacker, defender) { return defender.prefs.prey; }, - function(attacker, defender) { return defender.prefs.vore.cock; } + function(attacker, defender) { return defender.prefs.vore.unbirth > 0; } ], requirements: [ function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }, @@ -1070,10 +1124,11 @@ function seliciaGrabSwallow(attacker) { function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }, function(attacker, defender) { return attacker.flags.voreType == "stomach"; } ], conditions: [ - function(attacker, defender) { return defender.prefs.prey; } + function(attacker, defender) { return defender.prefs.prey; }, + function(attacker, defender) { return defender.prefs.vore.oral > 0; } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return defender.prefs.vore.oral; } }; } @@ -1090,10 +1145,10 @@ function seliciaGrabUnbirth(attacker) { function(attacker, defender) { return attacker.flags.voreType == "stomach"; } ], conditions: [ function(attacker, defender) { return defender.prefs.prey; }, - function(attacker, defender) { return defender.prefs.vore.cock; } + function(attacker, defender) { return defender.prefs.vore.unbirth > 0; } ], priority: 1, - weight: function(attacker, defender) { return 2; } + weight: function(attacker, defender) { return defender.prefs.vore.unbirth; } }; } @@ -1141,10 +1196,10 @@ function seliciaPinUnbirth(attacker) { function(attacker, defender) { return attacker.flags.voreType == "unbirth"; } ], conditions: [ function(attacker, defender) { return defender.prefs.prey; }, - function(attacker, defender) { return defender.prefs.vore.cock; } + function(attacker, defender) { return defender.prefs.vore.unbirth > 0; } ], priority: 1, - weight: function(attacker, defender) { return 1; } + weight: function(attacker, defender) { return defender.prefs.vore.unbirth; } }; } diff --git a/feast.css b/feast.css index 00a054f..dfd8eb7 100644 --- a/feast.css +++ b/feast.css @@ -163,9 +163,40 @@ button { } #character-form-list { + margin: auto; list-style-type: none; } #character-form { font-size: 20pt; } + +.pref-radio { + display: none; +} + +.pref-radio + label { + color: #666; + width: 150px; +} + +.pref-radio:checked + label { + background: #333; + color: #eee; +} + +.pref-select { + display: flex; + align-items: center; + justify-content: center; +} + +.pref-list { + text-align: center; + margin: auto; + user-select: none; +} + +.pref-type { + width: 150px; +} diff --git a/feast.html b/feast.html index 0502dda..ea46618 100644 --- a/feast.html +++ b/feast.html @@ -185,26 +185,89 @@ -