Kaynağa Gözat

Can now set vore preferences. Trance got more chompy moves

tags/v0.2.8
Fen Dweller 7 yıl önce
ebeveyn
işleme
d365a0fb9b
6 değiştirilmiş dosya ile 215 ekleme ve 41 silme
  1. +14
    -10
      combat.js
  2. +71
    -16
      customs.js
  3. +31
    -0
      feast.css
  4. +75
    -12
      feast.html
  5. +16
    -0
      feast.js
  6. +8
    -3
      vore.js

+ 14
- 10
combat.js Dosyayı Görüntüle

@@ -165,7 +165,8 @@ function grappleDevour(attacker) {
}, requirements: [ }, requirements: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; }
], conditions: [ ], 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, priority: 1,
weight: function(attacker, defender) { return 1 - defender.health / defender.maxHealth; } weight: function(attacker, defender) { return 1 - defender.health / defender.maxHealth; }
@@ -189,7 +190,8 @@ function grappledDevour(attacker) {
}, requirements: [ }, requirements: [
function(attacker, defender) { return isGrappled(attacker) && isNormal(defender) && attacker.flags.shrunk != true; } function(attacker, defender) { return isGrappled(attacker) && isNormal(defender) && attacker.flags.shrunk != true; }
], conditions: [ ], 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, priority: 1,
}; };
@@ -217,7 +219,8 @@ function grappleAnalVore(attacker) {
}, requirements: [ }, requirements: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true ; } function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true ; }
], conditions: [ ], 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, priority: 1,
}; };
@@ -307,7 +310,7 @@ function grappledReverse(attacker) {
}, },
requirements: [ requirements: [
function(attacker, defender) { return isGrappled(attacker) && isNormalSize(attacker) && isNormal(defender); }, 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, priority: 1,
}; };
@@ -350,6 +353,9 @@ function shrunkSwallow(attacker) {
function(attacker, defender) { function(attacker, defender) {
return isNormal(attacker) && defender.flags.grappled == true && defender.flags.shrunk == true; 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 priority: 2
}; };
@@ -412,18 +418,16 @@ function pass(attacker) {


function devourPlayer(attacker) { function devourPlayer(attacker) {
return { return {
name: "Devours YOU!",
desc: "You won't see this",
conditions: [
function(attacker, defender) { return defender.prefs.prey; }
],
requirements: [ requirements: [
function(attacker, defender) { return attacker.leering == true; } function(attacker, defender) { return attacker.leering == true; }
], ],
attackPlayer: function(defender) { attackPlayer: function(defender) {
changeMode("eaten"); 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 <i>belch</i> escapes his gullet, his hunger briefly sated...and your existence now in inescapable peril."]; 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 <i>belch</i> 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, priority: 1,
}; };
} }


+ 71
- 16
customs.js Dosyayı Görüntüle

@@ -28,7 +28,7 @@ function Geta() {
this.struggles.push(new rub(this)); this.struggles.push(new rub(this));


this.prefs.scat = false; this.prefs.scat = false;
this.prefs.analVore = false;
this.prefs.vore.anal = 0;
} }


function getaShrink(attacker) { function getaShrink(attacker) {
@@ -227,6 +227,8 @@ function Trance() {
this.attacks.push(new grappleSubdue(this)); this.attacks.push(new grappleSubdue(this));
this.attacks.push(new tranceGrappleMaul(this)); this.attacks.push(new tranceGrappleMaul(this));
this.attacks.push(new tranceGrappleThroat(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 grappledReverse(this));
this.attacks.push(new grappledDevour(this)); this.attacks.push(new grappledDevour(this));
@@ -329,10 +331,11 @@ function tranceGrappleDevour(attacker) {
}, requirements: [ }, requirements: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; } function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; }
], conditions: [ ], 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, 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) { function tranceGrappleThroat(attacker) {
return { return {
attackPlayer: function(defender) { 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 isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; },
function(attacker, defender) { return attacker.flags.grappleType == "hands"; } function(attacker, defender) { return attacker.flags.grappleType == "hands"; }
], conditions: [ ], 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, 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"; } function(attacker, defender) { return attacker.flags.grappleType == "hands"; }
], conditions: [ ], conditions: [
function(attacker, defender) { return defender.prefs.prey; }, 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, 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); } function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
], ],
priority: 1, 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 <i>pile</i> of wallets. Score!"]); }; 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 <i>pile</i> of wallets. Score!"]); };


this.prefs.scat = false; this.prefs.scat = false;
this.prefs.analVore = false;
this.prefs.prey = false; this.prefs.prey = false;

this.attacks = []; this.attacks = [];


this.attacks.push(seliciaBite(this)); this.attacks.push(seliciaBite(this));
@@ -1016,7 +1070,7 @@ function seliciaTailUnbirth(attacker) {
}, },
conditions: [ conditions: [
function(attacker, defender) { return defender.prefs.prey; }, 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: [ requirements: [
function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }, 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 isNormal(attacker) && isGrappled(defender); },
function(attacker, defender) { return attacker.flags.voreType == "stomach"; } function(attacker, defender) { return attacker.flags.voreType == "stomach"; }
], conditions: [ ], 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, 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"; } function(attacker, defender) { return attacker.flags.voreType == "stomach"; }
], conditions: [ ], conditions: [
function(attacker, defender) { return defender.prefs.prey; }, 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, 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"; } function(attacker, defender) { return attacker.flags.voreType == "unbirth"; }
], conditions: [ ], conditions: [
function(attacker, defender) { return defender.prefs.prey; }, 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, priority: 1,
weight: function(attacker, defender) { return 1; }
weight: function(attacker, defender) { return defender.prefs.vore.unbirth; }
}; };
} }




+ 31
- 0
feast.css Dosyayı Görüntüle

@@ -163,9 +163,40 @@ button {
} }


#character-form-list { #character-form-list {
margin: auto;
list-style-type: none; list-style-type: none;
} }


#character-form { #character-form {
font-size: 20pt; 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;
}

+ 75
- 12
feast.html Dosyayı Görüntüle

@@ -185,26 +185,89 @@
<label for="character-species">Species</label> <label for="character-species">Species</label>
<input type="text" id="character-species" name="species" placeholder="nerd"/> <input type="text" id="character-species" name="species" placeholder="nerd"/>
</li> </li>
<li>
<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-vore-cock">Cock vore</label>
<input type="checkbox" id="character-prefs-vore-cock" name="prefs-vore-cock" checked="true" />
</li>
<li>
<label for="character-prefs-vore-unbirth">Unbirth</label>
<input type="checkbox" id="character-prefs-vore-unbirth" name="prefs-vore-unbirth" checked="true" />
</li>
<li> <li>
<label for="character-prefs-scat">Disposal/scat</label> <label for="character-prefs-scat">Disposal/scat</label>
<input type="checkbox" id="character-prefs-scat" name="prefs-scat"/> <input type="checkbox" id="character-prefs-scat" name="prefs-scat"/>
</li> </li>
<li>
<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>
<label for="character-prefs-gore">Gore</label> <label for="character-prefs-gore">Gore</label>
<input type="checkbox" id="character-prefs-gore" name="prefs-gore"/> <input type="checkbox" id="character-prefs-gore" name="prefs-gore"/>
</li> </li>
<li>
<ul class="pref-list">
<div>Enemy vore types</div>
<li class="pref-select">
<span class="pref-type">Oral</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-oral-0" name="prefs-vore-oral" value="0" />
<label for="character-prefs-vore-oral-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-oral-1" name="prefs-vore-oral" value="1" />
<label for="character-prefs-vore-oral-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-oral-2" name="prefs-vore-oral" checked="true" value="2" />
<label for="character-prefs-vore-oral-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-oral-3" name="prefs-vore-oral" value="3" />
<label for="character-prefs-vore-oral-3">Prefer</label>
</li>
<li class="pref-select">
<span class="pref-type">Cock</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-cock-0" name="prefs-vore-cock" value="0" />
<label for="character-prefs-vore-cock-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-cock-1" name="prefs-vore-cock" value="1" />
<label for="character-prefs-vore-cock-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-cock-2" name="prefs-vore-cock" checked="true" value="2" />
<label for="character-prefs-vore-cock-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-cock-3" name="prefs-vore-cock" value="3" />
<label for="character-prefs-vore-cock-3">Prefer</label>
</li>
<li class="pref-select">
<span class="pref-type">Unbirth</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-unbirth-0" name="prefs-vore-unbirth" value="0" />
<label for="character-prefs-vore-unbirth-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-unbirth-1" name="prefs-vore-unbirth" value="1" />
<label for="character-prefs-vore-unbirth-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-unbirth-2" name="prefs-vore-unbirth" checked="true" value="2" />
<label for="character-prefs-vore-unbirth-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-unbirth-3" name="prefs-vore-unbirth" value="3" />
<label for="character-prefs-vore-unbirth-3">Prefer</label>
</li>
<li class="pref-select">
<span class="pref-type">Anal</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-anal-0" name="prefs-vore-anal" value="0" />
<label for="character-prefs-vore-anal-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-anal-1" name="prefs-vore-anal" value="1" />
<label for="character-prefs-vore-anal-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-anal-2" name="prefs-vore-anal" checked="true" value="2" />
<label for="character-prefs-vore-anal-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-anal-3" name="prefs-vore-anal" value="3" />
<label for="character-prefs-vore-anal-3">Prefer</label>
</li>
<li class="pref-select">
<span class="pref-type">Hard</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-hard-0" name="prefs-vore-hard" value="0" />
<label for="character-prefs-vore-hard-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-hard-1" name="prefs-vore-hard" value="1" />
<label for="character-prefs-vore-hard-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-hard-2" name="prefs-vore-hard" checked="true" value="2" />
<label for="character-prefs-vore-hard-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-hard-3" name="prefs-vore-hard" value="3" />
<label for="character-prefs-vore-hard-3">Prefer</label>
</li>
<li class="pref-select">
<span class="pref-type">Tail</span>
<input type="radio" class="pref-radio" id="character-prefs-vore-tail-0" name="prefs-vore-tail" value="0" />
<label for="character-prefs-vore-tail-0">Disabled</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-tail-1" name="prefs-vore-tail" value="1" />
<label for="character-prefs-vore-tail-1">Avoid</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-tail-2" name="prefs-vore-tail" checked="true" value="2" />
<label for="character-prefs-vore-tail-2">Enable</label>
<input type="radio" class="pref-radio" id="character-prefs-vore-tail-3" name="prefs-vore-tail" value="3" />
<label for="character-prefs-vore-tail-3">Prefer</label>
</li>
</ul>
</li>
<li> <li>
<button type="button" id="start-button">Start</button> <button type="button" id="start-button">Start</button>
</li> </li>


+ 16
- 0
feast.js Dosyayı Görüntüle

@@ -304,6 +304,7 @@ window.addEventListener('load', function(event) {


function start() { function start() {
applySettings(generateSettings()); applySettings(generateSettings());
transformVorePrefs(player.prefs);
document.getElementById("create").style.display = "none"; document.getElementById("create").style.display = "none";
document.getElementById("game").style.display = "block"; document.getElementById("game").style.display = "block";
document.getElementById("stat-button-status").addEventListener("click", status, false); document.getElementById("stat-button-status").addEventListener("click", status, false);
@@ -365,6 +366,21 @@ function applySettings(settings) {
} }
} }


// turn things like "1" into a number
function transformVorePrefs(prefs) {
for (let key in prefs.vore) {
if (prefs.vore.hasOwnProperty(key)) {
switch(prefs.vore[key]) {
case "0": prefs.vore[key] = 0; break;
case "1": prefs.vore[key] = 0.5; break;
case "2": prefs.vore[key] = 1; break;
case "3": prefs.vore[key] = 2; break;
}
}
}
return prefs;
}

function saveSettings() { function saveSettings() {
window.localStorage.setItem("settings", JSON.stringify(generateSettings())); window.localStorage.setItem("settings", JSON.stringify(generateSettings()));
} }


+ 8
- 3
vore.js Dosyayı Görüntüle

@@ -41,9 +41,14 @@ function Creature(name = "Creature", str=10, dex=10, con=10) {
this.prefs = { this.prefs = {
prey: true, prey: true,
scat: true, scat: true,
analVore: true,
gore: true,
grapple: true
grapple: true,
vore: {
oral: 1,
anal: 1,
cock: 1,
unbirth: 1,
hard: 1
}
}; };


this.cash = Math.floor(Math.random() * 10 + 5); this.cash = Math.floor(Math.random() * 10 + 5);


Yükleniyor…
İptal
Kaydet