munch
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

2595 wiersze
92 KiB

  1. /* AEZNON GETA COMMISSION */
  2. function Geta() {
  3. Creature.call(this, "Geta", 5, 15, 10);
  4. this.hasName = true;
  5. this.description = function() { return "Geta"; };
  6. this.attacks.push(new punchAttack(this));
  7. this.attacks.push(new getaShrink(this));
  8. this.attacks.push(new getaGrab(this));
  9. this.attacks.push(new getaTease(this));
  10. this.attacks.push(new getaSuckle(this));
  11. this.attacks.push(new getaSalivaSwallow(this));
  12. this.attacks.push(new getaSwallow(this));
  13. this.attacks.push(new getaStomp(this));
  14. this.attacks.push(new getaStompFinish(this));
  15. this.backupAttack = new pass(this);
  16. this.digests = [];
  17. this.digests.push(new digestPlayerStomach(this,50));
  18. this.struggles = [];
  19. this.struggles.push(new rub(this));
  20. this.prefs.scat = false;
  21. this.prefs.vore.anal = 0;
  22. }
  23. function getaShrink(attacker) {
  24. return {
  25. attackPlayer: function(defender) {
  26. let success = Math.random() < 0.5;
  27. if (success) {
  28. defender.flags.shrunk = true;
  29. 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."];
  30. } else {
  31. attacker.flags.shrunk = true;
  32. 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!"];
  33. }
  34. },
  35. requirements: [
  36. function(attacker, defender) {
  37. return isNormal(attacker) && isNormal(defender);
  38. }
  39. ],
  40. priority: 2
  41. };
  42. }
  43. function getaGrab(attacker) {
  44. return {
  45. attackPlayer: function(defender) {
  46. defender.flags.grappled = true;
  47. return [attacker.description() + " leans down and snatches you up, stuffing you into his maw."];
  48. },
  49. conditions: [
  50. function(attacker, defender) {
  51. return defender.prefs.prey;
  52. }
  53. ],
  54. requirements: [
  55. function(attacker, defender) {
  56. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled != true;
  57. },
  58. ],
  59. priority: 2
  60. };
  61. }
  62. function getaTease(attacker) {
  63. return {
  64. attackPlayer: function(defender) {
  65. defender.stamina = Math.max(defender.stamina - 25, 0);
  66. return [attacker.description() + " grinds you against the roof of his maw with his tongue."];
  67. },
  68. requirements: [
  69. function(attacker, defender) {
  70. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled == true && defender.stamina > 0;
  71. }
  72. ],
  73. priority: 1
  74. };
  75. }
  76. function getaSuckle(attacker) {
  77. return {
  78. attackPlayer: function(defender) {
  79. defender.stamina = Math.max(defender.stamina - 45, 0);
  80. return [attacker.description() + " shuts his jaws and suckles on you."];
  81. },
  82. requirements: [
  83. function(attacker, defender) {
  84. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled == true && defender.stamina > 0;
  85. }
  86. ],
  87. priority: 1
  88. };
  89. }
  90. function getaSalivaSwallow(attacker) {
  91. return {
  92. attackPlayer: function(defender) {
  93. defender.stamina = Math.max(defender.stamina - 15, 0);
  94. return [attacker.description() + " swallows, draining the drool from his jaws - leaving you on the precipice of his gullet."];
  95. },
  96. requirements: [
  97. function(attacker, defender) {
  98. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled == true && defender.stamina > 0;
  99. }
  100. ],
  101. priority: 1
  102. };
  103. }
  104. function getaSwallow(attacker) {
  105. return {
  106. attackPlayer: function(defender) {
  107. changeMode("eaten");
  108. return [attacker.description() + " shuts his jaws and swallows, dragging you down into his tight throat and dumping you into a caustic stomach."];
  109. },
  110. requirements: [
  111. function(attacker, defender) {
  112. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled == true && defender.stamina <= 0;
  113. }
  114. ],
  115. priority: 2
  116. };
  117. }
  118. function getaStomp(attacker) {
  119. return {
  120. attackPlayer: function(defender) {
  121. let success = statCheck(attacker, defender, "dex") || statCheck(attacker, defender, "dex") || defender.stamina == 0;
  122. if (success) {
  123. defender.health = Math.max(-100, defender.health - 50 - Math.round(Math.random() * 25));
  124. defender.stamina = 0;
  125. return [attacker.description() + "'s paw comes crashing down on your little body, smashing you into the dirt."];
  126. } else {
  127. return ["You dive away as " + attacker.description() + "'s paw slams down, narrowly missing your little body."];
  128. }
  129. },
  130. requirements: [
  131. function(attacker, defender) {
  132. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled != true;
  133. }
  134. ],
  135. priority: 2,
  136. };
  137. }
  138. function getaStompFinish(attacker) {
  139. return {
  140. attackPlayer: function(defender) {
  141. defender.health = -100;
  142. return [attacker.description() + " looms over your stunned body. You can only watch as his toes flex, squeeze...and come down hard. The fox's paw crushes you like an insect, tearing you open and spilling your guts across the dusty trail. He grinds you a few times more for good measure, leaving a disfigured, broken mess in your place."];
  143. },
  144. requirements: [
  145. function(attacker, defender) {
  146. return isNormal(attacker) && defender.flags.shrunk == true && defender.flags.grappled != true;
  147. },
  148. function(attacker, defender) {
  149. return defender.stamina <= 0;
  150. }
  151. ],
  152. conditions: [
  153. function(attacker, defender) {
  154. return defender.prefs.vore.hard > 0;
  155. }
  156. ],
  157. priority: 3,
  158. };
  159. }
  160. function GetaObj() {
  161. GameObject.call(this, "Geta");
  162. this.actions.push( {
  163. "name": "Approach Geta",
  164. "action": function() {
  165. startDialog(new GetaDialog());
  166. }
  167. });
  168. }
  169. function GetaDialog() {
  170. DialogNode.call(this);
  171. this.text = ["You approach the sandy-furred fox."];
  172. {
  173. let nodeFight = new DialogNode();
  174. this.addChoice("He certainly looks tasty...", nodeFight);
  175. nodeFight.text = ["You stalk up to your prey, but he sees you coming. You're going to have to fight!"];
  176. nodeFight.hooks.push( function(){
  177. currentFoe = new Geta();
  178. changeMode("combat");
  179. });
  180. }
  181. {
  182. let nodeIgnore = new DialogNode();
  183. this.addChoice("Leave him be", nodeIgnore);
  184. }
  185. }
  186. /* TRANCE */
  187. function Trance() {
  188. Creature.call(this, "Trance", 25, 20, 25);
  189. this.hasName = true;
  190. this.description = function() { return "Trance"; };
  191. this.attacks.push(new punchAttack(this));
  192. this.attacks.push(new tranceKick(this));
  193. this.attacks.push(new tranceStomp(this));
  194. this.attacks.push(new tranceGrapple(this));
  195. this.attacks.push(new tranceGrappleDevour(this));
  196. this.attacks.push(new grappleSubdue(this));
  197. this.attacks.push(new tranceGrappleMaul(this));
  198. this.attacks.push(new tranceGrappleThroat(this));
  199. this.attacks.push(new tranceGrappleConsume(this));
  200. this.attacks.push(new tranceGrappleKill(this));
  201. this.attacks.push(new grappledReverse(this));
  202. this.attacks.push(new grappledDevour(this));
  203. this.backupAttack = new pass(this);
  204. this.digests = [];
  205. this.digests.push(new tranceDigest(this,50));
  206. this.digests.push(new tranceDigestCrush(this,75));
  207. this.digests.push(new tranceDigestInstakill(this,75));
  208. this.struggles = [];
  209. this.struggles.push(new struggleStay(this));
  210. this.struggles.push(submit(this));
  211. this.startCombat = function() { return ["You yelp and turn around as hot breath spills over your shoulder. A massive sergal has crept up on you...and he looks <i>hungry</i>"]; };
  212. this.finishDigest = function() { return ["The sergal's crushing guts reduce you to a pool of chyme..."]; };
  213. this.defeated = function() { changeMode("explore"); update(["The sergal winces and stumbles, grabbing a thick branch to steady himself...and snapping it in half like a twig. You decide discretion is the better part of valor and run while you can."]); };
  214. this.prefs.prey = false;
  215. }
  216. function tranceKick(attacker) {
  217. return {
  218. attackPlayer: function(defender) {
  219. attacker.changeStamina(-25);
  220. defender.changeStamina(-50);
  221. return [attacker.description("The") + " leaps at you, lashing out with sharp-clawed paws and goring you for " + attack(attacker, defender, attacker.str * 3) + " damage"];
  222. }, requirements: [
  223. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  224. ], conditions: [
  225. function(attacker, defender) { return defender.prefs.vore.hard > 0; }
  226. ],
  227. priority: 1,
  228. weight: function(attacker, defender) { return 0.5 * defender.prefs.vore.hard * defender.health / defender.maxHealth; }
  229. };
  230. }
  231. function tranceGrapple(attacker) {
  232. return {
  233. attackPlayer: function(defender) {
  234. let success = statHealthCheck(attacker, defender, "str");
  235. if (success) {
  236. attacker.changeStamina(-15);
  237. defender.changeStamina(-50);
  238. defender.flags.grappled = true;
  239. return [attacker.description("The") + " lunges at you, pinning you to the floor!"];
  240. } else {
  241. attacker.changeStamina(-25);
  242. defender.changeStamina(-15);
  243. return [attacker.description("The") + " tries to tackle you, but you deftly avoid them."];
  244. }
  245. },
  246. requirements: [
  247. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  248. ],
  249. priority: 1,
  250. weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; }
  251. };
  252. }
  253. function tranceStomp(attacker) {
  254. return {
  255. attackPlayer: function(defender) {
  256. attacker.changeStamina(-10);
  257. defender.changeStamina(-100);
  258. let result = [attacker.description("The") + " shoves you to the ground, planting one foot on your chest and crushing your head beneath the other, crippling you and dealing " + attack(attacker, defender, attacker.str * 5) + " damage"];
  259. if (defender.health <= 0) {
  260. result[0] += ". Your skull breaks open as his crushing weight snuffs you out like a candle, smearing your brain across the ground and splitting your jaw in half. <i>Ouch.</i>";
  261. defender.health = -100;
  262. }
  263. return result;
  264. }, requirements: [
  265. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  266. ], conditions: [
  267. function(attacker, defender) { return defender.prefs.vore.hard > 0; }
  268. ],
  269. priority: 1,
  270. weight: function(attacker, defender) { return attacker.health * defender.prefs.vore.hard / attacker.maxHealth > 0.5 ? 0 : 3; },
  271. gameover: function() { return "Crushed under Trance's paw"; }
  272. };
  273. }
  274. function tranceGrappleDevour(attacker) {
  275. return {
  276. attackPlayer: function(defender) {
  277. let success = statHealthCheck(attacker, defender, "str");
  278. if(success) {
  279. attacker.changeStamina(-10);
  280. defender.changeStamina(-50);
  281. defender.flags.grappled = false;
  282. changeMode("eaten");
  283. return [attacker.description("The") + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp."];
  284. } else {
  285. attacker.changeStamina(-25);
  286. defender.changeStamina(-25);
  287. return [attacker.description("The") + " tries to swallow you down, but you manage to resist their hunger."];
  288. }
  289. }, requirements: [
  290. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; }
  291. ], conditions: [
  292. function(attacker, defender) { return defender.prefs.prey; },
  293. function(attacker, defender) { return defender.prefs.vore.oral > 0; }
  294. ],
  295. priority: 1,
  296. weight: function(attacker, defender) { return (defender.prefs.vore.oral) * (3 - 2 * defender.health / defender.maxHealth); }
  297. };
  298. }
  299. function tranceGrappleMaul(attacker) {
  300. return {
  301. attackPlayer: function(defender) {
  302. attacker.changeStamina(-25);
  303. defender.changeStamina(-50);
  304. return [attacker.description("The") + " digs into you with his claws and jaws, ripping you apart for " + attack(attacker, defender, attacker.str * 4) + " damage"];
  305. },
  306. requirements: [
  307. function(attacker, defender) {
  308. return isNormal(attacker) && isGrappled(defender);
  309. }
  310. ],
  311. conditions: [
  312. function(attacker, defender) {
  313. return defender.prefs.vore.hard > 0;
  314. }
  315. ],
  316. priority: 1,
  317. weight: function(attacker, defender) { return defender.prefs.vore.hard * defender.health / defender.maxHealth; },
  318. gameover: function() { return "Mauled by Trance"; }
  319. };
  320. }
  321. function tranceGrappleConsume(attacker) {
  322. return {
  323. attackPlayer: function(defender) {
  324. defender.health = -100;
  325. 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."];
  326. },
  327. requirements: [
  328. function(attacker, defender) {
  329. return isNormal(attacker) && isGrappled(defender);
  330. },
  331. function(attacker, defender) {
  332. return defender.stamina <= 0 && defender.health <= 0;
  333. }
  334. ],
  335. conditions: [
  336. function(attacker, defender) {
  337. return defender.prefs.vore.hard > 0;
  338. }
  339. ],
  340. priority: 3,
  341. weight: function(attacker, defender) { return defender.prefs.vore.hard; },
  342. gameover: function() { return "Ripped apart and devoured by Trance"; }
  343. };
  344. }
  345. function tranceGrappleKill(attacker) {
  346. return {
  347. attackPlayer: function(defender) {
  348. defender.health = -100;
  349. 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."];
  350. },
  351. requirements: [
  352. function(attacker, defender) {
  353. return isNormal(attacker) && isGrappled(defender);
  354. },
  355. function(attacker, defender) {
  356. return defender.stamina <= 0;
  357. }
  358. ],
  359. conditions: [
  360. function(attacker, defender) {
  361. return defender.prefs.vore.hard > 0;
  362. }
  363. ],
  364. priority: 2,
  365. weight: function(attacker, defender) { return defender.prefs.vore.hard; },
  366. gameover: function() { return "Ripped apart and devoured by Trance"; }
  367. };
  368. }
  369. function tranceGrappleThroat(attacker) {
  370. return {
  371. attackPlayer: function(defender) {
  372. let success = statHealthCheck(attacker, defender, "str");
  373. if (success) {
  374. attacker.changeStamina(-10);
  375. defender.health = 0;
  376. defender.stamina = 0;
  377. return ["Trance's pointed snout lunges for your throat, crushing jaws sinking in deep and ripping out your windpipe. He grins and swallows his mouthful of meat...and you fall limp."];
  378. } else {
  379. return ["The sergal lunges for your throat, but you manage to keep his terrifying jaws at bay."];
  380. }
  381. },
  382. conditions: [
  383. function(attacker, defender) {
  384. return defender.prefs.vore.hard > 0;
  385. }
  386. ],
  387. requirements: [
  388. function(attacker, defender) {
  389. return isNormal(attacker) && isGrappled(defender);
  390. }
  391. ],
  392. priority: 1,
  393. weight: function(attacker, defender) { return defender.health / defender.maxHealth > attacker.health / attacker.maxHealth ? 2 * defender.prefs.vore.hard : 0; },
  394. gameover: function() { return "Throat ripped out by Trance"; }
  395. };
  396. }
  397. function tranceDigest(predator,damage=50) {
  398. return {
  399. digest: function(player) {
  400. attack(predator, player, damage);
  401. player.changeStamina(-50);
  402. return pickRandom([
  403. [predator.description("The") + "'s powerful stomach grinds over your body, swiftly digesting you."],
  404. ["The stomach walls clench and squeeze, smearing your squirming body in chyme and stinging acids."],
  405. ["Your body is crushed and churned, ground against fleshy walls to sate the sergal's hunger."]]);
  406. },
  407. priority: 1,
  408. weight: function() { return 1; }
  409. };
  410. }
  411. function tranceDigestCrush(predator, damage=75) {
  412. return {
  413. digest: function(player) {
  414. attack(predator, player, damage);
  415. player.changeStamina(-125);
  416. return ["Trance's belly clenches, crushing your body between walls of ruthless muscle. Bones snap and tendons strain. The chyme floods your mouth."];
  417. },
  418. conditions: [
  419. function(attacker, defender) {
  420. return defender.prefs.vore.hard > 0;
  421. }
  422. ],
  423. priority: 1,
  424. weight: function(attacker, defender) { return defender.prefs.vore.hard / 0.5; }
  425. };
  426. }
  427. function tranceDigestInstakill(predator) {
  428. return {
  429. digest: function(player) {
  430. player.health = -100;
  431. return ["A ripple of muscle catches your head in just the right way, crushing your skull like a grape. Your lifeless body slumps in the caustic pit of slime and acid...and you melt away."];
  432. },
  433. conditions: [
  434. function(attacker, defender) {
  435. return defender.prefs.vore.hard > 0;
  436. }
  437. ],
  438. priority: 1,
  439. weight: function(attacker, defender) { return defender.stamina <= 0 ? 5 : 0.1 * defender.prefs.vore.hard; }
  440. };
  441. }
  442. /* TALUTHUS */
  443. function Taluthus() {
  444. Creature.call(this, "Taluthus", 40, 40, 60);
  445. this.hasName = true;
  446. this.description = function() { return "Taluthus"; };
  447. this.startCombat = function() { return ["You jump back as a hulking kitsune leaps out at you, his four massive tails swaying as he sizes you up."]; };
  448. this.finishDigest = function() {
  449. switch(this.flags.grappleType) {
  450. case "belly": return ["The kitsune's guts break you down..."];
  451. case "balls": return ["The kitsune melts you down into cum..."];
  452. }
  453. return ["The kitsune digests you..."];
  454. };
  455. this.defeated = function() { changeMode("explore"); moveToByName("Nature Trail"); update(["The kitsune growls and vanishes in a blinding flash of light. You pass out, eventually coming to in the woods."]); };
  456. this.prefs.prey = false;
  457. this.prefs.grapple = false;
  458. this.attacks.push(taluthusPunchAttack(this));
  459. this.attacks.push(taluthusGrab(this));
  460. this.attacks.push(taluthusGrabDevour(this));
  461. this.attacks.push(taluthusGrabCockVore(this));
  462. this.attacks.push(taluthusTailDevour(this));
  463. this.digests = [];
  464. this.digests.push(taluthusDigest(this));
  465. this.digests.push(taluthusTailSwallow(this));
  466. this.digests.push(taluthusCockSwallow(this));
  467. this.digests.push(taluthusBallsDigest(this));
  468. this.struggles = [];
  469. this.struggles.push(taluthusBallStruggle(this));
  470. this.struggles.push(taluthusBellyStruggle(this));
  471. this.struggles.push(taluthusTailStruggle(this));
  472. this.struggles.push(taluthusCockStruggle(this));
  473. this.struggles.push(submit(this));
  474. }
  475. function taluthusPunchAttack(attacker) {
  476. return {
  477. attackPlayer: function(defender) {
  478. let damage = attack(attacker, defender, attacker.str);
  479. return ["Taluthus lunges, striking you for " + damage + " damage"];
  480. }, requirements: [
  481. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  482. ],
  483. priority: 1,
  484. weight: function(attacker, defender) { return defender.health / defender.maxHealth; }
  485. };
  486. }
  487. function taluthusGrab(attacker) {
  488. return {
  489. attackPlayer: function(defender) {
  490. let success = statHealthCheck(attacker, defender, "str");
  491. if (success) {
  492. attacker.changeStamina(-15);
  493. defender.changeStamina(-50);
  494. attacker.flags.grappleType = "hands";
  495. defender.flags.grappled = true;
  496. return ["The kitsune snatches you up in his stocky grip, lifting you off the ground and cramming your head into his sloppy maw!"];
  497. } else {
  498. attacker.changeStamina(-25);
  499. defender.changeStamina(-15);
  500. return ["Taluthus tries to grab you, but you manage to avoid his grasp."];
  501. }
  502. },
  503. requirements: [
  504. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  505. ],
  506. priority: 1,
  507. weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; }
  508. };
  509. }
  510. function taluthusGrabDevour(attacker) {
  511. return {
  512. attackPlayer: function(defender) {
  513. let success = statHealthCheck(attacker, defender, "str");
  514. if(success) {
  515. attacker.changeStamina(-10);
  516. defender.changeStamina(-50);
  517. defender.flags.grappled = false;
  518. attacker.flags.grappleType = "belly";
  519. changeMode("eaten");
  520. return ["Taluthus forces your head into his glowing throat, swallowing forcefully to pull you down to his predatory depths."];
  521. } else {
  522. attacker.changeStamina(-25);
  523. defender.changeStamina(-25);
  524. return ["The kitsune forces your head into his gullet, but you manage to pry yourself free before peristalsis can claim you."];
  525. }
  526. }, requirements: [
  527. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; },
  528. function(attacker, defender) { return attacker.flags.grappleType == "hands"; }
  529. ], conditions: [
  530. function(attacker, defender) { return defender.prefs.prey; },
  531. function(attacker, defender) { return defender.prefs.vore.oral > 0; }
  532. ],
  533. priority: 1,
  534. weight: function(attacker, defender) { return defender.prefs.vore.oral; }
  535. };
  536. }
  537. function taluthusGrabCockVore(attacker) {
  538. return {
  539. attackPlayer: function(defender) {
  540. let success = statHealthCheck(attacker, defender, "str");
  541. if(success) {
  542. attacker.changeStamina(-10);
  543. defender.changeStamina(-50);
  544. defender.flags.grappled = true;
  545. attacker.flags.grappleType = "cock";
  546. attacker.flags.cockSwallows = 4;
  547. changeMode("eaten");
  548. return ["Taluthus abruptly shoves you downward, enveloping your feet in his black shaft."];
  549. } else {
  550. attacker.changeStamina(-25);
  551. defender.changeStamina(-25);
  552. return ["The kitsune tries to force you into his cock, but you keep your feet free."];
  553. }
  554. }, requirements: [
  555. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender) && defender.flags.shrunk != true; },
  556. function(attacker, defender) { return attacker.flags.grappleType == "hands"; }
  557. ], conditions: [
  558. function(attacker, defender) { return defender.prefs.prey; },
  559. function(attacker, defender) { return defender.prefs.vore.cock > 0; }
  560. ],
  561. priority: 1,
  562. weight: function(attacker, defender) { return defender.prefs.vore.cock; }
  563. };
  564. }
  565. function taluthusTailDevour(attacker) {
  566. return {
  567. attackPlayer: function(defender) {
  568. let success = statHealthCheck(attacker, defender, "str");
  569. if (success) {
  570. attacker.changeStamina(-15);
  571. defender.changeStamina(-50);
  572. attacker.flags.grappleType = "tail";
  573. attacker.flags.tailSwallows = 3;
  574. defender.flags.grappled = true;
  575. changeMode("eaten");
  576. return ["You yelp as one of the kitsune's massive tails snakes up, maw splitting wide open and taking you in with ease."];
  577. } else {
  578. attacker.changeStamina(-25);
  579. defender.changeStamina(-15);
  580. return ["You leap back as one of the kitsune's huge tails tries to make a meal of you, narrowly escaping the gaping maw."];
  581. }
  582. },
  583. requirements: [
  584. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  585. ],
  586. priority: 1,
  587. weight: function(attacker, defender) { return (7 - 6 * defender.health / defender.maxHealth) * defender.prefs.vore.tail; }
  588. };
  589. }
  590. function taluthusDigest(predator,damage=50) {
  591. return {
  592. digest: function(player) {
  593. attack(predator, player, damage);
  594. player.changeStamina(-50);
  595. return pickRandom([
  596. ["Powerful stomach muscles grind at your body, swiftly digesting you."]
  597. ]);
  598. },
  599. requirements: [
  600. function(attacker, defender) { return attacker.flags.grappleType == "belly"; }
  601. ],
  602. priority: 1,
  603. weight: function() { return 1; },
  604. gameover: function() { return "Digested in the glowing gut of Taluthus"; }
  605. };
  606. }
  607. function taluthusBallsDigest(predator,damage=50) {
  608. return {
  609. digest: function(player) {
  610. attack(predator, player, damage);
  611. player.changeStamina(-50);
  612. return pickRandom([
  613. ["Thick, musky cum smears over your body, steadily breaking you down into seed."]
  614. ]);
  615. },
  616. requirements: [
  617. function(attacker, defender) { return attacker.flags.grappleType == "balls"; }
  618. ],
  619. priority: 1,
  620. weight: function() { return 1; },
  621. gameover: function() { return "Dissolved into cum by Taluthus"; }
  622. };
  623. }
  624. function taluthusTailSwallow(predator,damage=50) {
  625. return {
  626. digest: function(player) {
  627. let success = statHealthCheck(predator, player, "str");
  628. if (success) {
  629. predator.changeStamina(-5);
  630. player.changeStamina(-25);
  631. predator.flags.tailSwallows -= 1;
  632. if (predator.flags.tailSwallows == 0) {
  633. player.flags.grappled = false;
  634. predator.flags.grappleType = "belly";
  635. return ["A powerful swallow drags you into Taluthus' stomach. You curl up in the bioluminescent prison as it begins to <i>squeeze.</i>"];
  636. } else {
  637. return ["A powerful swallow pulls you deeper, further from the world and closer to the kitsune's greedy guts."];
  638. }
  639. } else {
  640. predator.changeStamina(-15);
  641. player.changeStamina(-25);
  642. return ["You brace yourself against the walls of the tail's throat, holding yourself in place as a wave of peristalsis rolls past."];
  643. }
  644. },
  645. requirements: [
  646. function(attacker, defender) { return attacker.flags.grappleType == "tail"; }
  647. ],
  648. priority: 1,
  649. weight: function() { return 1; }
  650. };
  651. }
  652. function taluthusCockSwallow(predator) {
  653. return {
  654. digest: function(player) {
  655. let success = statHealthCheck(predator, player, "str");
  656. if (success) {
  657. predator.changeStamina(-5);
  658. player.changeStamina(-25);
  659. predator.flags.cockSwallows -= 1;
  660. if (predator.flags.cockSwallows == 0) {
  661. player.flags.grappled = false;
  662. predator.flags.grappleType = "balls";
  663. return ["A final clench drags you all the way into the kitsune's balls. Your body is roughly crammed into a lake of blue cum, squeezed on all sides by hot, musky flesh."];
  664. } else {
  665. return ["A powerful swallow pulls you deeper into Taluthus' shaft."];
  666. }
  667. } else {
  668. predator.changeStamina(-15);
  669. player.changeStamina(-25);
  670. return ["You brace yourself against the walls of the crushing shaft, holding yourself in place as he clenches."];
  671. }
  672. },
  673. requirements: [
  674. function(attacker, defender) { return attacker.flags.grappleType == "cock"; }
  675. ],
  676. priority: 1,
  677. weight: function() { return 1; }
  678. };
  679. }
  680. function taluthusBellyStruggle(predator) {
  681. return {
  682. name: "Struggle",
  683. desc: "Try to squirm free. More effective if you've hurt your predator.",
  684. struggle: function(player) {
  685. let escape = Math.random() > predator.health / predator.maxHealth && Math.random() < 0.33;
  686. if (player.health <= 0 || player.stamina <= 0) {
  687. escape = escape && Math.random() < 0.25;
  688. }
  689. if (escape) {
  690. player.clear();
  691. predator.clear();
  692. return {
  693. "escape": "stay",
  694. "lines": ["You struggle and squirm, forcing " + predator.description("the") + " to hork you up. They're not done with you yet..."]
  695. };
  696. } else {
  697. return {
  698. "escape": "stuck",
  699. "lines": ["You squirm and writhe within " + predator.description("the") + " to no avail."]
  700. };
  701. }
  702. },
  703. requirements: [
  704. function(predator, player) {
  705. return predator.flags.grappleType == "belly";
  706. }
  707. ]
  708. };
  709. }
  710. function taluthusBallStruggle(predator) {
  711. return {
  712. name: "Struggle",
  713. desc: "Try to squirm free. More effective if you've hurt your predator.",
  714. struggle: function(player) {
  715. let escape = Math.random() > predator.health / predator.maxHealth && Math.random() < 0.33;
  716. if (player.health <= 0 || player.stamina <= 0) {
  717. escape = escape && Math.random() < 0.25;
  718. }
  719. if (escape) {
  720. player.clear();
  721. predator.clear();
  722. return {
  723. "escape": "stay",
  724. "lines": ["You struggle and squirm, forcing Tal to let you out of his cock. He's not done with you yet..."]
  725. };
  726. } else {
  727. return {
  728. "escape": "stuck",
  729. "lines": ["You squirm and writhe within Tal's balls, to no avail."]
  730. };
  731. }
  732. },
  733. requirements: [
  734. function(predator, player) {
  735. return predator.flags.grappleType == "balls";
  736. }
  737. ]
  738. };
  739. }
  740. function taluthusTailStruggle(predator) {
  741. return {
  742. name: "Struggle",
  743. desc: "Try to squirm free. More effective if you've hurt your predator.",
  744. struggle: function(player) {
  745. let escape = Math.random() > predator.health / predator.maxHealth && Math.random() < 0.33;
  746. if (player.health <= 0 || player.stamina <= 0) {
  747. escape = escape && Math.random() < 0.25;
  748. }
  749. let position = "";
  750. switch(predator.flags.tailSwallows) {
  751. case 1:
  752. position = "You're one good swallow away from being dragged into Tal's stomach.";
  753. break;
  754. case 2:
  755. position = "Your bulge is perilously deep in the kitsune's tail, hanging close to the ground.";
  756. break;
  757. case 3:
  758. position = "You're halfway down the beast's tail, utterly smothered by heat and muscle.";
  759. break;
  760. case 4:
  761. position = "You're close to freedom, your paws hanging from that wretched tailmaw.";
  762. break;
  763. }
  764. if (escape) {
  765. predator.flags.tailSwallows += 1;
  766. if (predator.flags.tailSwallows > 4) {
  767. return {
  768. "escape": "stay",
  769. "lines": ["You struggle and squirm, forcing your way out from the kitsune's voracious tail."]
  770. };
  771. } else {
  772. return {
  773. "escape": "stuck",
  774. "lines": ["You struggle and squirm, inching closer to freedom.", newline, position]
  775. };
  776. }
  777. } else {
  778. return {
  779. "escape": "stuck",
  780. "lines": ["You squirm and writhe within Tal's tail, to no avail.", newline, position]
  781. };
  782. }
  783. },
  784. requirements: [
  785. function(predator, player) {
  786. return predator.flags.grappleType == "tail" && predator.flags.tailSwallows > 0;
  787. }
  788. ]
  789. };
  790. }
  791. function taluthusCockStruggle(predator) {
  792. return {
  793. name: "Struggle",
  794. desc: "Try to squirm free. More effective if you've hurt your predator.",
  795. struggle: function(player) {
  796. let escape = Math.random() > predator.health / predator.maxHealth && Math.random() < 0.33;
  797. if (player.health <= 0 || player.stamina <= 0) {
  798. escape = escape && Math.random() < 0.25;
  799. }
  800. let position = "";
  801. switch(predator.flags.cockSwallows) {
  802. case 1:
  803. position = "You're one clench away from being dragged into Tal's balls, utterly lost inside that throbbing cock.";
  804. break;
  805. case 2:
  806. position = "Your face is grinding against the tip of the sune's shaft.";
  807. break;
  808. case 3:
  809. position = "Your upper body is still hanging outside of Tal's cock.";
  810. break;
  811. case 4:
  812. position = "You're almost free - only your legs are trapped in that tight sune cock.";
  813. break;
  814. }
  815. if (escape) {
  816. predator.flags.tailSwallows += 1;
  817. if (predator.flags.tailSwallows > 4) {
  818. return {
  819. "escape": "stay",
  820. "lines": ["You struggle and squirm, forcing your way out from the kitsune's voracious shaft."]
  821. };
  822. } else {
  823. return {
  824. "escape": "stuck",
  825. "lines": ["You struggle and squirm, inching closer to freedom.", newline, position]
  826. };
  827. }
  828. } else {
  829. return {
  830. "escape": "stuck",
  831. "lines": ["You squirm and writhe within Tal's shaft, to no avail.", newline, position]
  832. };
  833. }
  834. },
  835. requirements: [
  836. function(predator, player) {
  837. return predator.flags.grappleType == "cock" && predator.flags.cockSwallows > 0;
  838. }
  839. ]
  840. };
  841. }
  842. /* SELICIA */
  843. function Selicia() {
  844. Creature.call(this, "Selicia", 25, 25, 25);
  845. this.hasName = true;
  846. this.mass = 400;
  847. this.description = function() { return "Selicia"; };
  848. this.startCombat = function() { return ["You stumble across a small cave. Stepping closer to investigate, you find yourself face-to-face with a glossy, slender dragon! Her ten-foot body is matched by a tail that's nearly as long, and she looms over you, devious blue eyes framed by curved horns."]; };
  849. this.finishDigest = function() {
  850. switch(this.flags.voreType) {
  851. case "stomach": return ["The dragoness's belly breaks you down..."];
  852. case "womb": return ["Your struggles slow, then stop, as your body is broken down to slick femcum by the dragoness's greedy womb. She quivers and groans with pent-up lust, grinding against the wall to set herself off - bringing forth a flood of hot, clingy nectar from her depths. The eruption sprays over the wall and ground, gushing in great spurts as she pants and thrusts with tail held high.",newline,"You were nothing but an orgasm..."];
  853. }
  854. return ["The dragoness digests you..."];
  855. };
  856. 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!"]); };
  857. this.prefs.scat = false;
  858. this.prefs.prey = false;
  859. this.attacks = [];
  860. this.attacks.push(seliciaBite(this));
  861. this.attacks.push(seliciaTailSlap(this));
  862. this.attacks.push(seliciaTailGrab(this));
  863. this.attacks.push(seliciaTailCrush(this));
  864. this.attacks.push(seliciaTailUnbirth(this));
  865. this.attacks.push(seliciaGrab(this));
  866. this.attacks.push(seliciaGrabSwallow(this));
  867. this.attacks.push(seliciaGrabUnbirth(this));
  868. this.attacks.push(grappledReverse(this));
  869. this.attacks.push(seliciaPin(this));
  870. this.attacks.push(seliciaPinUnbirth(this));
  871. this.attacks.push(seliciaPinGrind(this));
  872. this.digests = [];
  873. this.digests.push(seliciaStomachDigest(this));
  874. this.digests.push(seliciaUnbirthPull(this));
  875. this.digests.push(seliciaWombDigest(this));
  876. this.struggles = [];
  877. this.struggles.push(seliciaStomachStruggle(this));
  878. this.struggles.push(seliciaUnbirthStruggle(this));
  879. this.struggles.push(seliciaWombStruggle(this));
  880. this.struggles.push(submit(this));
  881. }
  882. function seliciaBite(attacker) {
  883. return {
  884. attackPlayer: function(defender) {
  885. let damage = attack(attacker, defender, attacker.str);
  886. return ["Selicia lunges, biting you for " + damage + " damage"];
  887. }, requirements: [
  888. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  889. ],
  890. priority: 1,
  891. weight: function(attacker, defender) { return defender.health / defender.maxHealth; }
  892. };
  893. }
  894. function seliciaTailSlap(attacker) {
  895. return {
  896. attackPlayer: function(defender) {
  897. let damage = attack(attacker, defender, attacker.dex * 1.5);
  898. return ["Selicia's tail sweeps around, slapping you for " + damage + " damage"];
  899. }, requirements: [
  900. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  901. ],
  902. priority: 1,
  903. weight: function(attacker, defender) { return defender.health / defender.maxHealth; }
  904. };
  905. }
  906. function seliciaTailGrab(attacker) {
  907. return {
  908. attackPlayer: function(defender) {
  909. let success = statHealthCheck(attacker, defender, "str");
  910. if (success) {
  911. attacker.changeStamina(-15);
  912. defender.changeStamina(-25);
  913. defender.flags.grappled = true;
  914. attacker.flags.voreType = "tail";
  915. return ["Selicia's thick tail whips around, curling around your body and hoisting you into the air!"];
  916. } else {
  917. attacker.changeStamina(-25);
  918. defender.changeStamina(-15);
  919. return ["Selicia's tail whips at you. You deflect it with your arms, keeping it from coiling around your chest."];
  920. }
  921. },
  922. requirements: [
  923. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  924. ],
  925. priority: 1,
  926. weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; }
  927. };
  928. }
  929. function seliciaTailCrush(attacker) {
  930. return {
  931. attackPlayer: function(defender) {
  932. attacker.changeStamina(-15);
  933. defender.changeStamina(-50);
  934. attack(attacker, defender, attacker.str*2);
  935. defender.flags.grappled = true;
  936. return ["Selicia's thick tail crushes you, squeezing the air from your lungs."];
  937. },
  938. requirements: [
  939. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  940. function(attacker, defender) { return attacker.flags.voreType == "tail"; }
  941. ],
  942. priority: 1,
  943. weight: function(attacker, defender) { return 1; },
  944. gameover: function() { return "Constricted by Selicia's tail"; }
  945. };
  946. }
  947. function seliciaTailUnbirth(attacker) {
  948. return {
  949. attackPlayer: function(defender) {
  950. let success = statHealthCheck(attacker, defender, "dex");
  951. if (success) {
  952. attacker.changeStamina(-15);
  953. defender.changeStamina(-25);
  954. attacker.flags.voreType = "unbirth";
  955. defender.flags.grappled = false;
  956. changeMode("eaten");
  957. return ["Your world spins as that thick dragon-tail delivers you head-first to a slick, greedy slit - cramming you in waist-deep and slowly withdrawing, leaving you behind as her latest toy."];
  958. } else {
  959. attacker.changeStamina(-25);
  960. defender.changeStamina(-15);
  961. return ["Selicia grinds your face against her slit, but you stay free of her greedy confines."];
  962. }
  963. },
  964. conditions: [
  965. function(attacker, defender) { return defender.prefs.prey; },
  966. function(attacker, defender) { return defender.prefs.vore.unbirth > 0; }
  967. ],
  968. requirements: [
  969. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  970. function(attacker, defender) { return attacker.flags.voreType == "tail"; }
  971. ],
  972. priority: 1,
  973. weight: function(attacker, defender) { return 1; }
  974. };
  975. }
  976. function seliciaGrab(attacker) {
  977. return {
  978. attackPlayer: function(defender) {
  979. let success = statHealthCheck(attacker, defender, "str");
  980. if (success) {
  981. attacker.changeStamina(-15);
  982. defender.changeStamina(-50);
  983. attacker.flags.voreType = "stomach";
  984. defender.flags.grappled = true;
  985. return ["The dragoness's jaws splay wide, glowing flesh entrancing you...and then enveloping you. She takes your upper body into her maw with ease."];
  986. } else {
  987. attacker.changeStamina(-25);
  988. defender.changeStamina(-15);
  989. return ["Selicia tries to snatch you up in her maw, but you manage to dive out of the way."];
  990. }
  991. },
  992. requirements: [
  993. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  994. ],
  995. priority: 1,
  996. weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; }
  997. };
  998. }
  999. function seliciaGrabSwallow(attacker) {
  1000. return {
  1001. attackPlayer: function(defender) {
  1002. let success = statHealthCheck(attacker, defender, "str");
  1003. if(success) {
  1004. attacker.changeStamina(-10);
  1005. defender.changeStamina(-50);
  1006. defender.flags.grappled = false;
  1007. changeMode("eaten");
  1008. return ["Selicia tips her head back and swallows, dragging your body down her long throat and into her empty stomach."];
  1009. } else {
  1010. attacker.changeStamina(-25);
  1011. defender.changeStamina(-25);
  1012. return ["The dragoness tilts back her head and swallows. You manage to resist the pull, hanging on with your legs dangling from her jaws."];
  1013. }
  1014. }, requirements: [
  1015. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  1016. function(attacker, defender) { return attacker.flags.voreType == "stomach"; }
  1017. ], conditions: [
  1018. function(attacker, defender) { return defender.prefs.prey; },
  1019. function(attacker, defender) { return defender.prefs.vore.oral > 0; }
  1020. ],
  1021. priority: 1,
  1022. weight: function(attacker, defender) { return defender.prefs.vore.oral; }
  1023. };
  1024. }
  1025. function seliciaGrabUnbirth(attacker) {
  1026. return {
  1027. attackPlayer: function(defender) {
  1028. attacker.changeStamina(-10);
  1029. defender.changeStamina(-75);
  1030. attacker.flags.voreType = "womb";
  1031. changeMode("eaten");
  1032. return ["Selicia rolls onto her back, curls up, and opens her jaws. You briefly think you're free...and then, your slide down into her nethers, dragged all the way into her womb by a massive <i>gulp</i> of greedy, overwheling muscle."];
  1033. }, requirements: [
  1034. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  1035. function(attacker, defender) { return attacker.flags.voreType == "stomach"; }
  1036. ], conditions: [
  1037. function(attacker, defender) { return defender.prefs.prey; },
  1038. function(attacker, defender) { return defender.prefs.vore.unbirth > 0; }
  1039. ],
  1040. priority: 1,
  1041. weight: function(attacker, defender) { return defender.prefs.vore.unbirth; }
  1042. };
  1043. }
  1044. function seliciaPin(attacker) {
  1045. return {
  1046. attackPlayer: function(defender) {
  1047. let success = statHealthCheck(attacker, defender, "dex");
  1048. if (success) {
  1049. attacker.changeStamina(-15);
  1050. defender.changeStamina(-50);
  1051. attacker.flags.voreType = "unbirth";
  1052. defender.flags.grappled = true;
  1053. return ["The beast lunges, bowling you over. She leaps up, spinning about mid-air, and lands hard on your prone body, grinding her hips - and her glistening nethers - over your face."];
  1054. } else {
  1055. attacker.changeStamina(-25);
  1056. defender.changeStamina(-15);
  1057. return ["Selicia leaps at you, forcing you to stumble backwards to avoid being crushed!"];
  1058. }
  1059. },
  1060. requirements: [
  1061. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  1062. ],
  1063. priority: 1,
  1064. weight: function(attacker, defender) { return 7 - 6 * defender.health / defender.maxHealth; }
  1065. };
  1066. }
  1067. function seliciaPinUnbirth(attacker) {
  1068. return {
  1069. attackPlayer: function(defender) {
  1070. let success = statHealthCheck(attacker, defender, "str");
  1071. if(success) {
  1072. attacker.changeStamina(-10);
  1073. defender.changeStamina(-50);
  1074. changeMode("eaten");
  1075. return ["Selicia's hips slam down, forcing your head into her cooch. Rippling muscle yanks you in up to your hips, leaving your flailing legs hanging from her nethers."];
  1076. } else {
  1077. attacker.changeStamina(-25);
  1078. defender.changeStamina(-25);
  1079. return ["The dragoness grinds on your face, trying to force it into her snatch - but you manage to resist, for now."];
  1080. }
  1081. }, requirements: [
  1082. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  1083. function(attacker, defender) { return attacker.flags.voreType == "unbirth"; }
  1084. ], conditions: [
  1085. function(attacker, defender) { return defender.prefs.prey; },
  1086. function(attacker, defender) { return defender.prefs.vore.unbirth > 0; }
  1087. ],
  1088. priority: 1,
  1089. weight: function(attacker, defender) { return defender.prefs.vore.unbirth; }
  1090. };
  1091. }
  1092. function seliciaPinGrind(attacker) {
  1093. return {
  1094. attackPlayer: function(defender) {
  1095. attack(attacker, defender, attacker.str*2);
  1096. attacker.changeStamina(-10);
  1097. defender.changeStamina(-25);
  1098. return ["Selicia grinds over your pinned body, smearing you in her scent and wearing you out and dealing " + attack(attacker, defender, attacker.str*2) + "damage."];
  1099. }, requirements: [
  1100. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  1101. function(attacker, defender) { return attacker.flags.voreType == "unbirth"; }
  1102. ],
  1103. priority: 1,
  1104. weight: function(attacker, defender) { return 1; },
  1105. gameover: function() { return "Snuffed out by Selicia's lust"; }
  1106. };
  1107. }
  1108. function seliciaUnbirthPull(predator) {
  1109. return {
  1110. digest: function(player) {
  1111. let pull = Math.random() >= player.stamina / player.maxStamina;
  1112. if (pull) {
  1113. let success = statHealthCheck(predator, player, "str") || player.stamina <= 0;
  1114. if (success) {
  1115. predator.changeStamina(-5);
  1116. player.changeStamina(-25);
  1117. predator.flags.voreType = "womb";
  1118. return ["A powerful swallow drags you into the slick, luminescent womb of Selicia. The walls clench and squeeze over your tender body, coaxing you to <i>melt.</i>"];
  1119. } else {
  1120. predator.changeStamina(-15);
  1121. player.changeStamina(-25);
  1122. return ["You grit your teeth and shove yourself back, resisting the powerful pull of the dragon's depths."];
  1123. }
  1124. } else {
  1125. predator.changeStamina(-25);
  1126. player.changeStamina(-150);
  1127. return ["Selicia shoves her hips against the cave wall, grinding you into her nethers - then relaxing, and letting you slide back. Being used as her toy exhausts you..."];
  1128. }
  1129. },
  1130. requirements: [
  1131. function(attacker, defender) { return attacker.flags.voreType == "unbirth"; }
  1132. ],
  1133. priority: 1,
  1134. weight: function() { return 1; }
  1135. };
  1136. }
  1137. function seliciaStomachDigest(predator) {
  1138. return {
  1139. digest: function(player) {
  1140. attack(predator, player, 50);
  1141. player.changeStamina(-20);
  1142. return [pickRandom([
  1143. ["Selicia's stomach clenches and grinds, dousing you in her acids."],
  1144. ["Crass gurgles and groans overwhelm you, the gastric prison steadily wearing you down..."],
  1145. ["You thump on the fleshy walls, eliciting a muffled <i>urrph</i> from your captor"],
  1146. ["You squirm and writhe, distending the dragoness's sagging belly."],
  1147. ["Your slimy confines squeeze tigether as you try to resist...and fail."]
  1148. ])];
  1149. },
  1150. requirements: [
  1151. function(attacker, defender) { return attacker.flags.voreType == "stomach"; }
  1152. ],
  1153. priority: 1,
  1154. weight: function() { return 1; },
  1155. gameover: function() { return "Digested in the depths of Selicia"; }
  1156. };
  1157. }
  1158. function seliciaWombDigest(predator) {
  1159. return {
  1160. digest: function(player) {
  1161. attack(predator, player, 50);
  1162. predator.changeStamina(-5);
  1163. player.changeStamina(-25);
  1164. let lines = [pickRandom([
  1165. ["Selicia's womb-walls ripple and knead, softening your body bit-by-bit."],
  1166. ["Your body bends at the whims of the dragoness's powerful nethers, mashed and squeezed with terrifying ease."],
  1167. ["You groan and whimper, head spinning and skin tingling as Selicia breaks you down."],
  1168. ["Everthing is getting heavy. You squirm and press at the walls of the dragoness's womb, causing her to moan in pleasure."],
  1169. ["<i>Grrrrgle-glorp</i> - you're melting in the dragoness's womb."],
  1170. ["Your prison is as loud as a full belly, grrrgle-gushes of femcum sloshing and spraying as you writhe."]
  1171. ])];
  1172. return lines;
  1173. },
  1174. requirements: [
  1175. function(attacker, defender) { return attacker.flags.voreType == "womb"; }
  1176. ],
  1177. priority: 1,
  1178. weight: function() { return 1; },
  1179. gameover: function() { return "Melted into femcum by Selicia"; }
  1180. };
  1181. }
  1182. function seliciaStomachStruggle(predator) {
  1183. return {
  1184. name: "Struggle",
  1185. desc: "Try to squirm out of Selicia's stomach. More effective if you've hurt your predator.",
  1186. struggle: function(player) {
  1187. let escape = statHealthCheck(player, predator, "str");
  1188. if (escape) {
  1189. return {
  1190. "escape": "stay",
  1191. "lines": ["Your struggles force Selicia to hork you up, leaving you dazed and confused on the ground."]
  1192. };
  1193. } else {
  1194. return {
  1195. "escape": "stuck",
  1196. "lines": ["You squirm and writhe, to no avail. The stomach walls squeeze tighter."]
  1197. };
  1198. }
  1199. },
  1200. requirements: [
  1201. function(predator, player) {
  1202. return predator.flags.voreType == "stomach";
  1203. }
  1204. ]
  1205. };
  1206. }
  1207. function seliciaWombStruggle(predator) {
  1208. return {
  1209. name: "Struggle",
  1210. desc: "Try to push yourself from the dragoness's womb. More effective if you've hurt your predator.",
  1211. struggle: function(player) {
  1212. let escape = statHealthCheck(player, predator, "str");
  1213. if (escape) {
  1214. predator.flags.voreType = "unbirth";
  1215. return {
  1216. "escape": "stuck",
  1217. "lines": ["Your struggles force the dragon to let you out of her womb...but you're still stuck in her snatch."]
  1218. };
  1219. } else {
  1220. return {
  1221. "escape": "stuck",
  1222. "lines": ["You squirm and writhe within the velvety walls of Selicia's womb, to no avail."]
  1223. };
  1224. }
  1225. },
  1226. requirements: [
  1227. function(predator, player) {
  1228. return predator.flags.voreType == "womb";
  1229. }
  1230. ]
  1231. };
  1232. }
  1233. function seliciaUnbirthStruggle(predator) {
  1234. return {
  1235. name: "Struggle",
  1236. desc: "Try to pull yourself free. More effective if you've hurt your predator.",
  1237. struggle: function(player) {
  1238. let escape = statHealthCheck(player, predator, "str");
  1239. if (escape) {
  1240. player.clear();
  1241. predator.clear();
  1242. return {
  1243. "escape": "stay",
  1244. "lines": ["With a mighty shove, you pop free of the dragoness's cooch - a loud, lewd <i>shllk</i> announcing your return to the world."]
  1245. };
  1246. } else {
  1247. return {
  1248. "escape": "stuck",
  1249. "lines": ["You squirm and writhe, to no avail."]
  1250. };
  1251. }
  1252. },
  1253. requirements: [
  1254. function(predator, player) {
  1255. return predator.flags.voreType == "unbirth";
  1256. }
  1257. ]
  1258. };
  1259. }
  1260. /* LALIM */
  1261. function LalimEncounter() {
  1262. DialogNode.call(this);
  1263. this.text = ["You stir from your slumber, groggy eyes blinking as your dimly-lit room comes into focus. Something feels wrong. You sit upright, freezing at a most peculiar sight - a twinkling, glittering star, hovering by your far wall. It's so pretty..."];
  1264. let approach = new DialogNode();
  1265. this.addChoice("Get closer to the light.", approach);
  1266. approach.hooks.push(function() {
  1267. startCombat(new Lalim());
  1268. });
  1269. {
  1270. let light = new DialogNode();
  1271. this.addChoice("Turn on the lights", light);
  1272. light.text = ["You reach over to your nightstand, fumbling around for the switch to your lamp. You pause as your fingers grasp at the knob - that light is <i>so pretty</i>."];
  1273. light.addChoice("Get closer to the light.", approach);
  1274. {
  1275. let lightReally = new DialogNode();
  1276. light.addChoice("No, really, turn on the lights", lightReally);
  1277. lightReally.text = ["You switch on the lamp. Light floods the room, revealing something most surreal. A jagged, shadowy rift has been torn in your far wall. Beyond is a vast void, speckled with stars and lit by a dim, all-pervading glow. And then, of course, there's the monster - a massive, furry beast with a maw full of fangs and a long, ornately-detailed body covered in jagged spirals of gold.",newline,"It hisses as the light floods its eyes, scuttling back and letting the portal snap shut.",newline,"So much for a restful night's sleep..."];
  1278. lightReally.hooks.push(function() {
  1279. advanceTimeTo(MORNING);
  1280. });
  1281. }
  1282. }
  1283. }
  1284. function Lalim() {
  1285. Creature.call(this, "Lalim", 25, 35, 25);
  1286. this.hasName = true;
  1287. this.description = function() { return "Lalim"; };
  1288. this.startCombat = function() { return ["You crawl from your bed, slowly walking over to that pretty, glittery star. It's so shiny...so pefect...and framed by fangs?",newline,"You awaken from your trance with a start, face to face with a grinning maw full of teeth. A massive beast - half-emerged from a swirling portal of darkness - grips you in its forepaws and drags you into a plane of darkness!",newline,"You groan and struggle to stand up, lungs heaving and heart hammering. Alas, this is no dream - you're faced with a waking nightmare."]; };
  1289. this.finishDigest = function() { return ["The slinky beast digests you..."];
  1290. };
  1291. this.defeated = function() { changeMode("explore"); update(["The beast yowls and recoils, leaving the portal back to your world unguarded. You take the opportunity and dive through; the rift winks shut behind you, leaving you alone. He's gone...for now."]); };
  1292. this.attacks = [];
  1293. this.attacks.push(lalimPin(this));
  1294. this.attacks.push(lalimSwallow(this));
  1295. this.attacks.push(lalimFeed(this));
  1296. this.attacks.push(lalimFeedPull(this));
  1297. this.attacks.push(lalimFeedDigest(this));
  1298. this.backupAttack = new pass(this);
  1299. this.digests = [];
  1300. this.digests.push(lalimDigest(this));
  1301. this.digests.push(lalimPull(this));
  1302. this.struggles = [];
  1303. this.struggles.push(lalimStruggle(this));
  1304. this.struggles.push(submit(this));
  1305. this.prefs.grapple = false;
  1306. this.prefs.prey = false;
  1307. }
  1308. function lalimFeed(attacker) {
  1309. return {
  1310. attackPlayer: function(defender) {
  1311. attacker.flags.feeding = true;
  1312. return ["Lalim darts back, abruptly ripping open a tear in his shadowy realm - jaws lunging in and snapping up some unseen victim, yanking them from the world of light into his gullet. His noisy swallows and gulps mix with muffled whimpers and cries as he gulps them down."];
  1313. }, requirements: [
  1314. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); },
  1315. function(attacker, defender) { return !attacker.flags.feeding && !attacker.flags.fed; }
  1316. ],
  1317. priority: 1,
  1318. weight: function(attacker, defender) { return 0.5 + (5 - 5 * attacker.stamina / attacker.maxStamina); }
  1319. };
  1320. }
  1321. function lalimFeedPull(attacker) {
  1322. return {
  1323. attackPlayer: function(defender) {
  1324. attacker.flags.fed = true;
  1325. attacker.flags.feeding = false;
  1326. return ["Lalim's prey sinks down his gullet, bulging out from his flexible stomach and swiftly plunging into his tail. Throbbing red light envelops the writhing meal, shrink-wrapped in Lalim's stretchy skin."];
  1327. }, requirements: [
  1328. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); },
  1329. function(attacker, defender) { return attacker.flags.feeding; }
  1330. ],
  1331. priority: 2,
  1332. weight: function(attacker, defender) { return 1; }
  1333. };
  1334. }
  1335. function lalimFeedDigest(attacker) {
  1336. return {
  1337. attackPlayer: function(defender) {
  1338. attacker.flags.fed = false;
  1339. attacker.str += 10;
  1340. attacker.dex += 10;
  1341. attacker.con += 10;
  1342. attacker.health += 100;
  1343. attacker.changeStamina(200);
  1344. return ["You watch in horror as that writhing bulge falls limp, loses substance...and digests completely. The monster seems invigorated by its meal..."];
  1345. }, requirements: [
  1346. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); },
  1347. function(attacker, defender) { return attacker.flags.fed; }
  1348. ],
  1349. priority: 2,
  1350. weight: function(attacker, defender) { return 1; }
  1351. };
  1352. }
  1353. function lalimPin(attacker) {
  1354. return {
  1355. attackPlayer: function(defender) {
  1356. let success = statHealthCheck(attacker, defender, "dex");
  1357. if (success) {
  1358. attacker.changeStamina(-5);
  1359. defender.changeStamina(-10);
  1360. defender.flags.grappled = true;
  1361. return ["Lalim lunges at you, knocking you to the floor. Before you can even land, his head and neck whip past; you land roughly on his translucent neck, swiftly finding yourself bound up by his slinky body."];
  1362. } else {
  1363. attacker.changeStamina(-15);
  1364. defender.changeStamina(-5);
  1365. return ["The beast leaps at you; you barely manage to avoid his massive frame, tumbling and stumbling back to your feet as he hisses and snarls."];
  1366. }
  1367. },
  1368. requirements: [
  1369. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  1370. ],
  1371. priority: 1,
  1372. weight: function(attacker, defender) { return 1; }
  1373. };
  1374. }
  1375. function lalimSwallow(attacker) {
  1376. return {
  1377. attackPlayer: function(defender) {
  1378. let success = statHealthCheck(attacker, defender, "dex");
  1379. if(success) {
  1380. attacker.changeStamina(-5);
  1381. defender.changeStamina(-5);
  1382. defender.flags.grappled = false;
  1383. attacker.flags.stage = 1;
  1384. changeMode("eaten");
  1385. return ["Lalim's jaws descend upon your little body, scooping you up feet-first and dragging you down with a lazy <i>glrrk</i>. You scrabble helplessly at slick flesh, sinking through his see-through throat...then halting, leaving you imprisoned in a bulging throat-pouch as your predator's forelimbs squeeze and knead over you."];
  1386. } else {
  1387. attacker.changeStamina(-10);
  1388. defender.changeStamina(-5);
  1389. return ["The noodly beast squeezes and shoves, lashing at your lower body with his tongue, but you manage to keep your legs from being slurped into that ravenous maw."];
  1390. }
  1391. }, requirements: [
  1392. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); },
  1393. ], conditions: [
  1394. function(attacker, defender) { return defender.prefs.prey; }
  1395. ],
  1396. priority: 1,
  1397. weight: function(attacker, defender) { return 2 - defender.stamina / defender.maxStamina; }
  1398. };
  1399. }
  1400. function lalimPull(predator) {
  1401. return {
  1402. digest: function(player) {
  1403. let success = statHealthCheck(predator, player, "dex");
  1404. if (success) {
  1405. player.changeStamina(-5);
  1406. predator.flags.stage += 1;
  1407. if (predator.flags.stage == 2) {
  1408. return ["The rippling walls convulse, sucking you deeper into Lalim's starry depths. The soothing squeezes of his clear throat-pouch turns to ha eavier pressure; the walls squeeze and churn, stronger than before...but still safe, for now."];
  1409. } else if (predator.flags.stage == 3) {
  1410. return ["A crushing wave of peristalsis yanks you from the dragon's belly, pulling you into the base of his tail. What was once surprisingly safe is now...unsettling. The slick walls grind and squeeze, and you could swear your skin is <i>tingling</i>"];
  1411. } else if (predator.flags.stage == 4) {
  1412. return ["Your arms and legs are pinned as Lalim drags you deeper. You feel as if you've been dragged down miles...and as your wriggling bulge glides down his tail, a pit of fear begins to form in your gut. The walls are resilient as iron bars, squeezing and clenching and <i>bearing down</i> with incredible force - and you have no where to go but deeper still..."];
  1413. } else if (predator.flags.stage == 5) {
  1414. return ["Another clench takes you to the very end - to the tip of Lalim's tail. It will all be over soon."];
  1415. }
  1416. } else {
  1417. predator.changeStamina(-5);
  1418. player.changeStamina(-5);
  1419. return ["You brace yourself as a wave of peristalsis rolls past, holding your ground against the onslaught of flesh and muscle."];
  1420. }
  1421. },
  1422. requirements: [
  1423. function(attacker, defender) { return attacker.flags.stage < 5; }
  1424. ],
  1425. priority: 1,
  1426. weight: function() { return player.stamina / player.maxStamina < (5 - predator.flags.stage) / 5 ? 3 : 0; }
  1427. };
  1428. }
  1429. function lalimDigest(predator) {
  1430. return {
  1431. digest: function(player) {
  1432. player.changeStamina(-3 * predator.flags.stage);
  1433. if (predator.flags.stage == 1) {
  1434. return ["Lalim's forepaws knead over your imprisoned body, squishing you about in a tube of soft flesh."];
  1435. } else if (predator.flags.stage == 2) {
  1436. return ["The beast's starry stomach walls undulate, quivering as he sprawls out to savor his meal."];
  1437. } else if (predator.flags.stage == 3) {
  1438. return ["You're feeling a little nervous. You struggle to press back on that rippling muscle that imprisons you."];
  1439. } else if (predator.flags.stage == 4) {
  1440. attack(predator, player, 15);
  1441. return ["You feel yourself slowly melting - slowly fading away into the dragon's depths."];
  1442. } else if (predator.flags.stage == 5) {
  1443. attack(predator, player, 75);
  1444. return ["Throbbing pain overwhelms your body as Lalim's tail crushes you."];
  1445. }
  1446. },
  1447. priority: 1,
  1448. weight: function() { return 1; }
  1449. };
  1450. }
  1451. function lalimStruggle(predator) {
  1452. return {
  1453. name: "Struggle",
  1454. desc: "Try to squirm free. Gets harder as you lose stamina. Don't get tired!",
  1455. struggle: function(player) {
  1456. let escape = false;
  1457. switch(predator.flags.stage) {
  1458. case 1:
  1459. escape = Math.random() < 0.1 * (1 + player.stamina / player.maxStamina);
  1460. if (escape) {
  1461. player.clear();
  1462. predator.clear();
  1463. return {
  1464. "escape": "stay",
  1465. "lines": ["You struggle and squirm, forcing Lalim to hork you up."]
  1466. };
  1467. } else {
  1468. line = "You're so close to freedom that you can taste it...and the beast denies you, gulping you back into his bulging throat";
  1469. }
  1470. break;
  1471. case 2:
  1472. escape = Math.random() < 0.35 * (1 + player.stamina / player.maxStamina);
  1473. if (escape)
  1474. line = "You push against slick flesh, forcing yourself back into Lalim's neck. You can see the portal to your dimly-lit bedroom again...and those kneading, squeezing paws.";
  1475. else
  1476. line = "You try to claw your way back up to the beast's throat...but a lazy ripple of stomach-muscle throws you back down, thumping you against the hard, shadowy ground under the beast's distended belly.";
  1477. break;
  1478. case 3:
  1479. escape = Math.random() < 0.35 * (1 + player.stamina / player.maxStamina);
  1480. if (escape)
  1481. line = "It's hard to tell just how deep you are...but you're back in the comforting green glow, far from that dreadful tail.";
  1482. else
  1483. line = "The tail won't let you go - you squirm and writhe, to no avail.";
  1484. break;
  1485. case 4:
  1486. escape = Math.random() < 0.2 * (1 + player.stamina / player.maxStamina);
  1487. if (escape)
  1488. line = "The tingling lessens as you force yourself into the base of Lalim's tail.";
  1489. else
  1490. line = "Your heart pounds as your struggles take you <i>nowhere</i>. Your body slowly digests in the ever-tightening tail.";
  1491. break;
  1492. case 5:
  1493. escape = Math.random() < 0.1 * (1 + player.stamina / player.maxStamina);
  1494. if (escape)
  1495. line = "You drag yourself from certain doom, clawing your way out of the crushing, deadly tail-tip.";
  1496. else
  1497. line = "There is no hope of escape. You thrash and squirm, but Lalim's tail has you.";
  1498. break;
  1499. }
  1500. if (escape) {
  1501. predator.flags.stage -= 1;
  1502. }
  1503. return {
  1504. "escape": "stuck",
  1505. "lines": [line]
  1506. };
  1507. },
  1508. requirements: [
  1509. ]
  1510. };
  1511. }
  1512. /* POOJAWA */
  1513. function PoojawaEncounter() {
  1514. GameObject.call(this, "Poojawa");
  1515. this.actions.push({
  1516. name: "Poojawa",
  1517. action: function() {
  1518. startCombat(new Poojawa());
  1519. },
  1520. conditions: [
  1521. function(player) {
  1522. return player.prefs.prey;
  1523. },
  1524. function(player) {
  1525. return player.prefs.vore.oral > 0 || player.prefs.vore.tail > 0 || player.prefs.vore.unbirth > 0;
  1526. }
  1527. ]
  1528. });
  1529. }
  1530. function Poojawa() {
  1531. Creature.call(this, "Poojawa", 20, 40, 30);
  1532. this.hasName = true;
  1533. this.description = function() { return "Poojawa"; };
  1534. this.attacks = [];
  1535. this.attacks.push(poojawaBeckonWait(this));
  1536. this.attacks.push(poojawaBeckonTease(this));
  1537. this.attacks.push(poojawaBeckonStep(this));
  1538. this.attacks.push(poojawaBeckonSaunter(this));
  1539. this.attacks.push(poojawaBeckonCatch(this));
  1540. this.attacks.push(poojawaBeckonCaught(this));
  1541. this.attacks.push(poojawaBeckonTeased(this));
  1542. this.attacks.push(poojawaCaughtLick(this));
  1543. this.attacks.push(poojawaCaughtTailLick(this));
  1544. this.attacks.push(poojawaCaughtGrind(this));
  1545. this.attacks.push(poojawaCaughtGrind(this));
  1546. this.attacks.push(poojawaCaughtUnbirth(this));
  1547. this.attacks.push(poojawaUnbirthPull(this));
  1548. this.attacks.push(poojawaUnbirthPush(this));
  1549. this.attacks.push(poojawaUnbirthClench(this));
  1550. this.attacks.push(poojawaUnbirthOrgasm(this));
  1551. this.attacks.push(poojawaUnbirthLastPull(this));
  1552. this.attacks.push(poojawaUnbirthedDigest(this));
  1553. this.attacks.push(poojawaUnbirthedRoll(this));
  1554. this.attacks.push(poojawaUnbirthedSoulRip(this));
  1555. this.attacks.push(poojawaCaughtOral(this));
  1556. this.attacks.push(poojawaOralPull(this));
  1557. this.attacks.push(poojawaOralLastPull(this));
  1558. this.attacks.push(poojawaCaughtTail(this));
  1559. this.attacks.push(poojawaTailPull(this));
  1560. this.attacks.push(poojawaTailLastPull(this));
  1561. this.attacks.push(poojawaStomachDigest(this));
  1562. this.attacks.push(poojawaStomachSoulRip(this));
  1563. this.backupAttack = new pass(this);
  1564. this.playerAttacks = [];
  1565. this.playerAttacks.push(poojawaPlayerBeckonForward);
  1566. this.playerAttacks.push(poojawaPlayerBeckonStay);
  1567. this.playerAttacks.push(poojawaPlayerBeckonBackward);
  1568. this.playerAttacks.push(poojawaPlayerBeckonFlee);
  1569. this.playerAttacks.push(poojawaPlayerCaughtOral);
  1570. this.playerAttacks.push(poojawaPlayerCaughtTail);
  1571. this.playerAttacks.push(poojawaPlayerCaughtUnbirth);
  1572. this.playerAttacks.push(poojawaPlayerCaughtStruggle);
  1573. //this.playerAttacks.push(poojawaPlayerUnbirthSubmit);
  1574. //this.playerAttacks.push(poojawaPlayerUnbirthStruggle);
  1575. this.digests = [];
  1576. this.digests.push(new digestPlayerStomach(this,50));
  1577. this.struggles = [];
  1578. this.struggles.push(new rub(this));
  1579. this.prefs.prey = false;
  1580. this.consts = {};
  1581. this.consts.caughtDist = 0;
  1582. this.consts.startDist = 3;
  1583. this.consts.escapeDist = 8;
  1584. this.consts.maxTease = 5;
  1585. this.flags.distance = this.consts.startDist;
  1586. this.flags.state = "beckon";
  1587. this.flags.tail = 0;
  1588. this.flags.oral = 0;
  1589. this.flags.unbirth = 1;
  1590. this.flags.progress = 0;
  1591. this.flags.arousal = 0;
  1592. this.startCombat = function(player) {
  1593. player.flags.teases = 0;
  1594. return ["You gasp softly as a purple hand grips your shoulder - turning and stumbling back a few paces to see that sultry sabersune watching you with devious eyes. She's up to no good..."];
  1595. };
  1596. this.finishCombat = function() {
  1597. switch(this.flags.state) {
  1598. case "unbirthed":
  1599. return ["Poojawa moans and pants, both hands <i>squeeeezing</i> her swiftly flattening lower belly...and then she reaches orgasm. She yowls, hackles standing on end - dropping onto her knees and steadying her self with one hand as her other plunges into her gushing slit.",
  1600. newline,
  1601. "Your former body gushes out as a torrent of slick, musky femcum, every grind of fingers coaxing out a greater spurt than the last. As impressive as her display is, most of your remains never see the light of the day - absorbed into her womb, just another victim of her endless lust..."];
  1602. case "stomach":
  1603. return ["Poojawa coos and grinds on her gut with both hands. You're barely conscious, lost among her sultry depths...and as she rolls over, the pressure becomes too much to bear.",
  1604. newline,
  1605. "You collapse, melting away and swiftly becoming a part of the sabresune's body."];
  1606. }
  1607. };
  1608. this.status = function(player) {
  1609. switch(this.flags.state) {
  1610. case "beckon":
  1611. if (this.flags.distance == 1) {
  1612. return ["The sabersune is one step away from taking you - alluring scents and sensual body so very close to yours..."];
  1613. } else if (this.flags.distance <= 3) {
  1614. return ["You're uncomfortably close to your predator."];
  1615. } else if (this.flags.distance <= 5) {
  1616. return ["There's a little room between you and Poojawa now...but not enough."];
  1617. } else {
  1618. return ["You're almost far enough to make a break for it. Surely she couldn't catch you now...right?"];
  1619. }
  1620. break;
  1621. case "caught":
  1622. return [];
  1623. case "unbirth":
  1624. if (this.flags.progress == 1) {
  1625. return ["Your head is stuffed into Poojawa's snatch. The velvety walls want the rest of you inside her...and they want you <i>now.</i>"];
  1626. } else if (this.flags.progress == 2 ) {
  1627. return ["She's claimed your upper body. Your head is grinding against the entrance to her hot, humid womb."];
  1628. } else {
  1629. return ["Only your shins and feet hang from the gorgeous predator's slit. Your head and chest are being gripped and squeezed by the sabersune's womb."];
  1630. }
  1631. break;
  1632. case "unbirthed":
  1633. return [];
  1634. case "oral":
  1635. if (this.flags.progress == 1) {
  1636. return ["Poojawa's devious eyes are locked with yours...and your legs are vanishing down her gullet. She's <i>hungry.</i>"];
  1637. } else if (this.flags.progress == 2 ) {
  1638. return ["Ravenous hunger has taken all but your head - teasing licks working over your face as your body is gripped by the predator's tight body."];
  1639. } else {
  1640. return ["Everything is tight, hot, overwhelming. She has you - head in her throat, legs already in her gut. Not much left to do but...give in."];
  1641. }
  1642. break;
  1643. case "tail":
  1644. if (this.flags.progress == 1) {
  1645. return ["Your limbs and face are clearly visible in the sabersune's bulging tail."];
  1646. } else if (this.flags.progress == 2 ) {
  1647. return ["You're deeper now...deeper in that hot, tight tail. Muscles squeeze and squelch over your delicious body."];
  1648. } else {
  1649. return ["You're just a bulge now, hanging low in a greedy tail and about to plunge into Poojawa's belly."];
  1650. }
  1651. break;
  1652. case "stomach":
  1653. return [];
  1654. }
  1655. };
  1656. }
  1657. /* PLAYER MOVES */
  1658. function poojawaPlayerBeckonForward(player) {
  1659. return {
  1660. name: "Step forward",
  1661. desc: "Get a little closer...",
  1662. attack: function(poojawa) {
  1663. poojawa.flags.distance -= 1;
  1664. return ["You swallow nervously, stepping closer to the sultry sabersune."];
  1665. },
  1666. requirements: [
  1667. function(player, poojawa) {
  1668. return poojawa.flags.state == "beckon";
  1669. }
  1670. ]
  1671. };
  1672. }
  1673. function poojawaPlayerBeckonStay(player) {
  1674. return {
  1675. name: "Stand still",
  1676. desc: "Just wait...",
  1677. attack: function(poojawa) {
  1678. return ["Your knees quiver as a blush washes over your face - and you stand still."];
  1679. },
  1680. requirements: [
  1681. function(player, poojawa) {
  1682. return poojawa.flags.state == "beckon";
  1683. }
  1684. ]
  1685. };
  1686. }
  1687. function poojawaPlayerBeckonBackward(player) {
  1688. return {
  1689. name: "Step backward",
  1690. desc: "Get a little further...",
  1691. attack: function(poojawa) {
  1692. if (player.flags.teases > 0) {
  1693. if (Math.random() * poojawa.consts.maxTease < player.flags.teases) {
  1694. return ["A lump forms in your throat - you're helpless, transfixed by the predatory sabersune's teases and threats."];
  1695. }
  1696. }
  1697. poojawa.flags.distance += 1;
  1698. return ["Wary for any surprises from the sabersune, you take a nervous step back."];
  1699. },
  1700. requirements: [
  1701. function(player, poojawa) {
  1702. return poojawa.flags.state == "beckon";
  1703. }
  1704. ]
  1705. };
  1706. }
  1707. function poojawaPlayerBeckonFlee(player) {
  1708. return {
  1709. name: "Run!",
  1710. desc: "Flee - if you've made enough distance, at least...",
  1711. attack: function(poojawa) {
  1712. if (poojawa.flags.distance <= 1) {
  1713. poojawa.flags.state = "caught";
  1714. poojawa.flags.distance = 0;
  1715. return ["In your panic, you turn to run. Poojawa clicks her tongue and grabs you by the arm, then pulls you in close..."];
  1716. } else if (poojawa.flags.distance <= 3) {
  1717. poojawa.flags.state = "caught";
  1718. poojawa.flags.distance = 0;
  1719. return ["You turn and run...and a few seconds later, the sabersune is on top of you, effortlessly tackling you and pinning you to the floor, then pulling you aside for some...<i>private time.</i>"];
  1720. } else if (poojawa.flags.distance <= 5) {
  1721. poojawa.flags.state = "caught";
  1722. poojawa.flags.distance = 0;
  1723. return ["You turn and flee. It's a valiant effort - you manage to grab the door handle - but not enough. Poojawa grips you from behind and drags you away, whispering a <i>tsk-tsk</i> of disapproval into your ear as you're pulled out of sight."];
  1724. } else {
  1725. if (Math.random() < 0.25 + (poojawa.flags.distance - 5) * 0.2) {
  1726. changeMode("explore");
  1727. moveToByName("Alley","");
  1728. return ["You turn tail and run, throwing open the door and barely escaping from the sabersune's clutches. She could easily chase you down, but she just leans outside, heavy tails propping the door open - and gives you a wink."];
  1729. } else {
  1730. poojawa.flags.state = "caught";
  1731. poojawa.flags.distance = 0;
  1732. return ["You turn and flee. It's a valiant effort - you manage to grab the door handle - but not enough. Poojawa grips you from behind and drags you away, whispering a <i>tsk-tsk</i> of disapproval into your ear as you're pulled out of sight."];
  1733. }
  1734. }
  1735. },
  1736. requirements: [
  1737. function(player, poojawa) {
  1738. return poojawa.flags.state == "beckon";
  1739. }
  1740. ]
  1741. };
  1742. }
  1743. function poojawaPlayerCaughtOral(player) {
  1744. return {
  1745. name: "Push at her mouth",
  1746. desc: "Imagine those soft, velvety depths clenching and caressing you...why not just give her a taste?",
  1747. attack: function(poojawa) {
  1748. poojawa.flags.oral += 1;
  1749. return ["You moan as the sabresune backs up and sluuuurps along your hips and belly. Judging by the sounds she's making, she's enjoying it too..."];
  1750. },
  1751. conditions: [
  1752. function(player, poojawa) {
  1753. return player.prefs.vore.oral > 0;
  1754. }
  1755. ],
  1756. requirements: [
  1757. function(player, poojawa) {
  1758. return poojawa.flags.state == "caught";
  1759. }
  1760. ]
  1761. };
  1762. }
  1763. function poojawaPlayerCaughtTail(player) {
  1764. return {
  1765. name: "Rub her tails",
  1766. desc: "Why not just give them a few pets?",
  1767. attack: function(poojawa) {
  1768. poojawa.flags.tail += 1;
  1769. return ["You reach out at one of Poojawa's swaying tails, stroking along soft fur and sneaking your hand into the slackeend maw. So soft..."];
  1770. },
  1771. conditions: [
  1772. function(player, poojawa) {
  1773. return player.prefs.vore.tail > 0;
  1774. }
  1775. ],
  1776. requirements: [
  1777. function(player, poojawa) {
  1778. return poojawa.flags.state == "caught";
  1779. }
  1780. ]
  1781. };
  1782. }
  1783. function poojawaPlayerCaughtUnbirth(player) {
  1784. return {
  1785. name: "Lick her sex",
  1786. desc: "Surely it's safe...",
  1787. attack: function(poojawa) {
  1788. poojawa.flags.unbirth += 1;
  1789. return ["Blushing hotly, you sit upright - as much as she'll allow - and press your snout to the sabersune's dripping snatch. She churrrrls softly as your tongue laps at sweet, musky nectar, flexing her toes and grinding back on you a little."];
  1790. },
  1791. conditions: [
  1792. function(player, poojawa) {
  1793. return player.prefs.vore.unbirth > 0;
  1794. }
  1795. ],
  1796. requirements: [
  1797. function(player, poojawa) {
  1798. return poojawa.flags.state == "caught";
  1799. }
  1800. ]
  1801. };
  1802. }
  1803. function poojawaPlayerCaughtStruggle(player) {
  1804. return {
  1805. name: "Struggle",
  1806. desc: "Try to escape!",
  1807. attack: function(poojawa) {
  1808. return ["You wriggle beneath the sultry 'sune...to no avail. She giggles and continues to tease."];
  1809. },
  1810. requirements: [
  1811. function(player, poojawa) {
  1812. return poojawa.flags.state == "caught";
  1813. }
  1814. ]
  1815. };
  1816. }
  1817. /* POOJAWA MOVES */
  1818. function poojawaBeckonWait(poojawa) {
  1819. return {
  1820. attackPlayer: function(player) {
  1821. return ["The sune does nothing - she just watches and waits, those pretty pink eyes locked with yours..."];
  1822. },
  1823. requirements: [
  1824. function(poojawa, player) {
  1825. return poojawa.flags.state == "beckon";
  1826. }
  1827. ],
  1828. priority: 1,
  1829. weight: function(poojawa, player) { return 1; }
  1830. };
  1831. }
  1832. function poojawaBeckonTease(poojawa) {
  1833. return {
  1834. attackPlayer: function(player) {
  1835. player.flags.teases += 1;
  1836. return ["Poojawa's jaws open part-way, flashing her slick fangs as she lets her tongue roll over her fingers ever-so-smoothly. \"Sweetie,\" she coos, \"you <i>know</i> you want this~\""];
  1837. },
  1838. requirements: [
  1839. function(poojawa, player) {
  1840. return poojawa.flags.state == "beckon";
  1841. }
  1842. ],
  1843. priority: 1,
  1844. weight: function(poojawa, player) { return player.flags.teases >= poojawa.consts.maxTease ? 0 : 1 - player.flags.teases / 10; }
  1845. };
  1846. }
  1847. function poojawaBeckonStep(poojawa) {
  1848. return {
  1849. attackPlayer: function(player) {
  1850. poojawa.flags.distance -= 1;
  1851. return ["Poojawa takes a step toward you, tails swaying behind her."];
  1852. },
  1853. requirements: [
  1854. function(poojawa, player) {
  1855. return poojawa.flags.state == "beckon";
  1856. }
  1857. ],
  1858. priority: 1,
  1859. weight: function(poojawa, player) { return 1; }
  1860. };
  1861. }
  1862. function poojawaBeckonSaunter(poojawa) {
  1863. return {
  1864. attackPlayer: function(player) {
  1865. poojawa.flags.distance -= 3;
  1866. return ["The sabersune takes a few lazy steps toward you, each one eroding several of your own anxious footsteps..."];
  1867. },
  1868. requirements: [
  1869. function(poojawa, player) {
  1870. return poojawa.flags.state == "beckon";
  1871. },
  1872. function(poojawa, player) {
  1873. return poojawa.flags.distance > 5;
  1874. }
  1875. ],
  1876. priority: 1,
  1877. weight: function(poojawa, player) { return poojawa.flags.distance / 6; }
  1878. };
  1879. }
  1880. function poojawaBeckonCatch(poojawa) {
  1881. return {
  1882. attackPlayer: function(player) {
  1883. poojawa.flags.state = "caught";
  1884. return ["One last step, and the sabersune is on top of you. She grips you with both hands, pulling you in close and stuffing your muzzle into her faintly-scented bosom. You squirm and struggle, but can do little as she pulls you away from the noisy bar and into a secluded alcove.",
  1885. newline,
  1886. "\"Shhh, darling,\" she murmurs, clicking her tongue at your muffled protests. \"Be good.\""];
  1887. },
  1888. requirements: [
  1889. function(poojawa, player) {
  1890. return poojawa.flags.state == "beckon";
  1891. },
  1892. function(poojawa, player) {
  1893. return poojawa.flags.distance == 1;
  1894. }
  1895. ],
  1896. priority: 1,
  1897. weight: function(poojawa, player) { return 1; }
  1898. };
  1899. }
  1900. function poojawaBeckonCaught(poojawa) {
  1901. return {
  1902. attackPlayer: function(player) {
  1903. poojawa.flags.state = "caught";
  1904. return ["You stumble forwards and into Poojawa's grasp. She grips you with both hands, pulling you in close and stuffing your muzzle into her faintly-scented bosom. You squirm and struggle, but can do little as she pulls you away from the noisy bar and into a secluded alcove.",
  1905. newline,
  1906. "\"Shhh, darling,\" she murmurs, clicking her tongue at your muffled protests. \"Be good.\""];
  1907. },
  1908. requirements: [
  1909. function(poojawa, player) {
  1910. return poojawa.flags.state == "beckon";
  1911. },
  1912. function(poojawa, player) {
  1913. return poojawa.flags.distance <= 0;
  1914. }
  1915. ],
  1916. priority: 2,
  1917. weight: function(poojawa, player) { return 1; }
  1918. };
  1919. }
  1920. function poojawaBeckonTeased(poojawa) {
  1921. return {
  1922. attackPlayer: function(player) {
  1923. poojawa.flags.state = "caught";
  1924. return ["You freeze up, completely transfixed by the beautiful sabersune. Her approach is slow, agonizing even - and there's nothing you can do about it. She grips you with both hands, pulling you in close and stuffing your muzzle into her faintly-scented bosom. You squirm and struggle, but can do little as she pulls you away from the noisy bar and into a secluded alcove.",
  1925. newline,
  1926. "\"Shhh, darling,\" she murmurs, clicking her tongue at your muffled protests. \"Be good.\""];
  1927. },
  1928. requirements: [
  1929. function(poojawa, player) {
  1930. return poojawa.flags.state == "beckon";
  1931. },
  1932. function(poojawa, player) {
  1933. return poojawa.flags.distance > 0;
  1934. },
  1935. function(poojawa, player) {
  1936. return player.flags.teases >= poojawa.consts.maxTease;
  1937. }
  1938. ],
  1939. priority: 2,
  1940. weight: function(poojawa, player) { return 1; }
  1941. };
  1942. }
  1943. function poojawaCaughtLick(poojawa) {
  1944. return {
  1945. attackPlayer: function(player) {
  1946. poojawa.flags.oral += 1;
  1947. return ["The sabersune's velvety tongue drags along your thigh, her dripping slit held firmly in your face as she tastes you over."];
  1948. },
  1949. conditions: [
  1950. function(poojawa, player) {
  1951. return player.prefs.vore.oral > 0;
  1952. }
  1953. ],
  1954. requirements: [
  1955. function(poojawa, player) {
  1956. return poojawa.flags.state == "caught";
  1957. }
  1958. ],
  1959. priority: 1,
  1960. weight: function(poojawa, player) { return player.prefs.vore.oral * (1 + poojawa.flags.oral / 3); }
  1961. };
  1962. }
  1963. function poojawaCaughtTailLick(poojawa) {
  1964. return {
  1965. attackPlayer: function(player) {
  1966. poojawa.flags.tail += 1;
  1967. return ["Slick flesh envelops your arms as two of the sabersune's tails get a little nibby."];
  1968. },
  1969. conditions: [
  1970. function(poojawa, player) {
  1971. return player.prefs.vore.tail > 0;
  1972. }
  1973. ],
  1974. requirements: [
  1975. function(poojawa, player) {
  1976. return poojawa.flags.state == "caught";
  1977. }
  1978. ],
  1979. priority: 1,
  1980. weight: function(poojawa, player) { return player.prefs.vore.tail * (1 + poojawa.flags.tail / 3); }
  1981. };
  1982. }
  1983. function poojawaCaughtGrind(poojawa) {
  1984. return {
  1985. attackPlayer: function(player) {
  1986. poojawa.flags.unbirth += 1;
  1987. return ["Poojawa's hips grind down over your face, smearing you in her musky scents and sending a shiver up her spine."];
  1988. },
  1989. conditions: [
  1990. function(poojawa, player) {
  1991. return player.prefs.vore.unbirth > 0;
  1992. }
  1993. ],
  1994. requirements: [
  1995. function(poojawa, player) {
  1996. return poojawa.flags.state == "caught";
  1997. }
  1998. ],
  1999. priority: 1,
  2000. weight: function(poojawa, player) { return player.prefs.vore.unbirth * (1 + poojawa.flags.unbirth / 3); }
  2001. };
  2002. }
  2003. function poojawaCaughtUnbirth(poojawa) {
  2004. return {
  2005. attackPlayer: function(player) {
  2006. changeBackground("eaten");
  2007. poojawa.flags.progress = 1;
  2008. poojawa.flags.state = "unbirth";
  2009. return ["The sune giggles, then slams her hips down over your head. A loud, wet <i>shllllck</i> fills your ears as you're stuffed into Poojawa's nethers, a spurt of nectar splattering over the wall from the sheer <i>strength</i> of that thrust.",
  2010. newline,
  2011. "Your nostrils flood with her scent; you can see only dim, red depths."];
  2012. },
  2013. conditions: [
  2014. function(poojawa, player) {
  2015. return player.prefs.vore.unbirth > 0;
  2016. }
  2017. ],
  2018. requirements: [
  2019. function(poojawa, player) {
  2020. return poojawa.flags.state == "caught";
  2021. },
  2022. function(poojawa, player) {
  2023. return poojawa.flags.unbirth > 3;
  2024. }
  2025. ],
  2026. priority: 1,
  2027. weight: function(poojawa, player) { return player.prefs.vore.unbirth * (0.5 + Math.pow(poojawa.flags.unbirth,2) / 6); }
  2028. };
  2029. }
  2030. function poojawaUnbirthPull(poojawa) {
  2031. return {
  2032. attackPlayer: function(player) {
  2033. poojawa.flags.arousal += 1;
  2034. poojawa.flags.progress += 1;
  2035. return ["A powerful ripple of muscle drags you deeper."];
  2036. },
  2037. requirements: [
  2038. function(poojawa, player) {
  2039. return poojawa.flags.state == "unbirth";
  2040. },
  2041. function(poojawa, player) {
  2042. return poojawa.flags.progress < 3;
  2043. }
  2044. ],
  2045. priority: 1,
  2046. weight: function(poojawa, player) { return 1; }
  2047. };
  2048. }
  2049. function poojawaUnbirthClench(poojawa) {
  2050. return {
  2051. attackPlayer: function(player) {
  2052. poojawa.flags.arousal += 2;
  2053. return ["Muscular walls clench and crush in on you, grinding hard and eliciting a gasp from your captor."];
  2054. },
  2055. requirements: [
  2056. function(poojawa, player) {
  2057. return poojawa.flags.state == "unbirth";
  2058. },
  2059. function(poojawa, player) {
  2060. return poojawa.flags.progress > 1;
  2061. }
  2062. ],
  2063. priority: 1,
  2064. weight: function(poojawa, player) { return 1; }
  2065. };
  2066. }
  2067. function poojawaUnbirthPush(poojawa) {
  2068. return {
  2069. attackPlayer: function(player) {
  2070. poojawa.flags.arousal += 4;
  2071. poojawa.flags.progress -= 1;
  2072. return ["Poojawa grips your ankles, yanking you part-way free and moaning in pleasure. You must feel so good..."];
  2073. },
  2074. requirements: [
  2075. function(poojawa, player) {
  2076. return poojawa.flags.state == "unbirth";
  2077. },
  2078. function(poojawa, player) {
  2079. return poojawa.flags.progress > 1;
  2080. }
  2081. ],
  2082. priority: 1,
  2083. weight: function(poojawa, player) { return 0.5; }
  2084. };
  2085. }
  2086. function poojawaUnbirthOrgasm(poojawa) {
  2087. return {
  2088. attackPlayer: function(player) {
  2089. poojawa.flags.state = "unbirthed";
  2090. return ["Poojawa yowls in pleasure as she cums...and yanks you inside with a single, massive <i>glrpk</i> of unstoppable muscle. She flops onto her belly, panting and groaning as she rides down from that pleasurable high."];
  2091. },
  2092. requirements: [
  2093. function(poojawa, player) {
  2094. return poojawa.flags.state == "unbirth";
  2095. },
  2096. function(poojawa, player) {
  2097. return poojawa.flags.arousal >= 10;
  2098. }
  2099. ],
  2100. priority: 2,
  2101. weight: function(poojawa, player) { return 1; }
  2102. };
  2103. }
  2104. function poojawaUnbirthLastPull(poojawa) {
  2105. return {
  2106. attackPlayer: function(player) {
  2107. poojawa.flags.state = "unbirthed";
  2108. return ["One last lustful squeeze, and your body slips into the sabersune's womb. She coos and sits up, slender fingers playing over her bulging lower belly as she begins to toy with you..."];
  2109. },
  2110. requirements: [
  2111. function(poojawa, player) {
  2112. return poojawa.flags.state == "unbirth";
  2113. },
  2114. function(poojawa, player) {
  2115. return poojawa.flags.progress >= 3;
  2116. }
  2117. ],
  2118. priority: 1,
  2119. weight: function(poojawa, player) { return 1; }
  2120. };
  2121. }
  2122. function poojawaUnbirthedDigest(poojawa) {
  2123. return {
  2124. attackPlayer: function(player) {
  2125. player.health -= 50;
  2126. if (player.health > 0) {
  2127. return pickRandom([["Poojawa murmurs with pleasure as she feels you squirm in her womb. Your body slowly softens as she takes you..."],
  2128. ["Hot, slick flesh grinds over your body. Every clench elicits another coo of lust from your predator."],
  2129. ]);
  2130. }
  2131. else {
  2132. return pickRandom([["The heat is overwhelming - powerful lust making short work of your tender body as you start to melt into femcum."],
  2133. ["You can't find the energy to struggle as Poojawa grinds your softening bulge against a barstool...breaking you down at a frightening pace."]
  2134. ]);
  2135. }
  2136. },
  2137. requirements: [
  2138. function(poojawa, player) {
  2139. return poojawa.flags.state == "unbirthed";
  2140. }
  2141. ],
  2142. priority: 1,
  2143. weight: function(poojawa, player) { return 1; },
  2144. gameover: function() { return "Melted into femcum in Poojawa's depths"; }
  2145. };
  2146. }
  2147. function poojawaUnbirthedRoll(poojawa) {
  2148. return {
  2149. attackPlayer: function(player) {
  2150. player.health -= 75;
  2151. return pickRandom([["Poojawa rolls over, hips thrusting at the hardwood floor and grinding you into her sensitive womb-walls."],
  2152. ["The sabersune shifts onto her side, then flumps onto her belly. The force balls you up even tighter..."],
  2153. ]);
  2154. },
  2155. requirements: [
  2156. function(poojawa, player) {
  2157. return poojawa.flags.state == "unbirthed";
  2158. },
  2159. function(poojawa, player) {
  2160. return player.health > 0;
  2161. }
  2162. ],
  2163. priority: 1,
  2164. weight: function(poojawa, player) { return 0.33; },
  2165. gameover: function() { return "Melted into femcum in Poojawa's depths"; }
  2166. };
  2167. }
  2168. function poojawaUnbirthedSoulRip(poojawa) {
  2169. return {
  2170. attackPlayer: function(player) {
  2171. player.health = -100;
  2172. return ["You feel a strange, ethereal presence...slowly realizing that your very soul is being pulled from your body. Womb-walls grip your spirit with the same practiced ease that they claimed your body with, molding and squeezing and grinding you down..."];
  2173. },
  2174. conditions: [
  2175. function(poojawa, player) {
  2176. return player.prefs.vore.soul > 0;
  2177. }
  2178. ],
  2179. requirements: [
  2180. function(poojawa, player) {
  2181. return poojawa.flags.state == "unbirthed";
  2182. },
  2183. function(poojawa, player) {
  2184. return player.health / player.maxHealth < 0.2;
  2185. }
  2186. ],
  2187. priority: 1,
  2188. weight: function(poojawa, player) { return player.prefs.vore.soul; },
  2189. gameover: function() { return "Body and soul melted down to femcum in Poojawa's depths"; }
  2190. };
  2191. }
  2192. function poojawaCaughtOral(poojawa) {
  2193. return {
  2194. attackPlayer: function(player) {
  2195. changeBackground("eaten");
  2196. poojawa.flags.progress = 1;
  2197. poojawa.flags.state = "oral";
  2198. return ["Poojawa's teasing licks and sultry breaths stop - a heartbeat before you feel your ankles slipping past her thick saber-fangs. A light gulp and a lazy <i>swallow</i> precede a disorienting slide as she drags you in front of her, her throat bulging with your thrashing lower legs!"];
  2199. },
  2200. conditions: [
  2201. function(poojawa, player) {
  2202. return player.prefs.vore.oral > 0;
  2203. }
  2204. ],
  2205. requirements: [
  2206. function(poojawa, player) {
  2207. return poojawa.flags.state == "caught";
  2208. },
  2209. function(poojawa, player) {
  2210. return poojawa.flags.oral > 3;
  2211. }
  2212. ],
  2213. priority: 1,
  2214. weight: function(poojawa, player) { return player.prefs.vore.oral * (0.5 + Math.pow(poojawa.flags.oral,2) / 6); }
  2215. };
  2216. }
  2217. function poojawaOralPull(poojawa) {
  2218. return {
  2219. attackPlayer: function(player) {
  2220. poojawa.flags.progress += 1;
  2221. return ["A powerful ripple of muscle drags you down the sabersune's throat."];
  2222. },
  2223. requirements: [
  2224. function(poojawa, player) {
  2225. return poojawa.flags.state == "oral";
  2226. },
  2227. function(poojawa, player) {
  2228. return poojawa.flags.progress < 3;
  2229. }
  2230. ],
  2231. priority: 1,
  2232. weight: function(poojawa, player) { return 1; }
  2233. };
  2234. }
  2235. function poojawaOralLastPull(poojawa) {
  2236. return {
  2237. attackPlayer: function(player) {
  2238. poojawa.flags.state = "stomach";
  2239. return ["A final swallow stuffs you into Poojawa's gurgling guts. Rippling muscle grips at your slimy body."];
  2240. },
  2241. requirements: [
  2242. function(poojawa, player) {
  2243. return poojawa.flags.state == "oral";
  2244. },
  2245. function(poojawa, player) {
  2246. return poojawa.flags.progress >= 3;
  2247. }
  2248. ],
  2249. priority: 1,
  2250. weight: function(poojawa, player) { return 1; }
  2251. };
  2252. }
  2253. function poojawaCaughtTail(poojawa) {
  2254. return {
  2255. attackPlayer: function(player) {
  2256. changeBackground("eaten");
  2257. poojawa.flags.progress = 1;
  2258. poojawa.flags.state = "tail";
  2259. return ["Your vision goes dark, upper body smothered in flesh as one of Poojawa's ravenous tails takes you in. Your squirms do little; you are food.",
  2260. newline,
  2261. "A powerful gulp yanks you in deep, leaving your wriggling toes hanging from that heavy tail."];
  2262. },
  2263. conditions: [
  2264. function(poojawa, player) {
  2265. return player.prefs.vore.tail > 0;
  2266. }
  2267. ],
  2268. requirements: [
  2269. function(poojawa, player) {
  2270. return poojawa.flags.state == "caught";
  2271. },
  2272. function(poojawa, player) {
  2273. return poojawa.flags.tail > 3;
  2274. }
  2275. ],
  2276. priority: 1,
  2277. weight: function(poojawa, player) { return player.prefs.vore.tail * (0.5 + Math.pow(poojawa.flags.tail,2) / 6); }
  2278. };
  2279. }
  2280. function poojawaTailPull(poojawa) {
  2281. return {
  2282. attackPlayer: function(player) {
  2283. poojawa.flags.progress += 1;
  2284. return ["A powerful ripple of muscle drags you deeper into the sabersune's tail."];
  2285. },
  2286. requirements: [
  2287. function(poojawa, player) {
  2288. return poojawa.flags.state == "tail";
  2289. },
  2290. function(poojawa, player) {
  2291. return poojawa.flags.progress < 3;
  2292. }
  2293. ],
  2294. priority: 1,
  2295. weight: function(poojawa, player) { return 1; }
  2296. };
  2297. }
  2298. function poojawaTailLastPull(poojawa) {
  2299. return {
  2300. attackPlayer: function(player) {
  2301. poojawa.flags.state = "stomach";
  2302. return ["A final swallow pulls you past the sabersune's hips and into her powerful stomach...stuffing you into a tight embrace of slick, slimy muscle."];
  2303. },
  2304. requirements: [
  2305. function(poojawa, player) {
  2306. return poojawa.flags.state == "tail";
  2307. },
  2308. function(poojawa, player) {
  2309. return poojawa.flags.progress >= 3;
  2310. }
  2311. ],
  2312. priority: 1,
  2313. weight: function(poojawa, player) { return 1; }
  2314. };
  2315. }
  2316. function poojawaStomachDigest(poojawa) {
  2317. return {
  2318. attackPlayer: function(player) {
  2319. player.health -= 50;
  2320. return ["Poojawa rubs her gut as you squirm within. You're already turning soft..."];
  2321. },
  2322. requirements: [
  2323. function(poojawa, player) {
  2324. return poojawa.flags.state == "stomach";
  2325. }
  2326. ],
  2327. priority: 1,
  2328. weight: function(poojawa, player) { return 1; }
  2329. };
  2330. }
  2331. function poojawaStomachSoulRip(poojawa) {
  2332. return {
  2333. attackPlayer: function(player) {
  2334. player.health = -100;
  2335. return ["The churning guts of the sabersune are too much, and you fall limp...only to return to the world as your soul is dragged from your softening body. Crushing muscle grips your spirit, swiftly wearing you down...."];
  2336. },
  2337. conditions: [
  2338. function(poojawa, player) {
  2339. return player.prefs.vore.soul > 0;
  2340. }
  2341. ],
  2342. requirements: [
  2343. function(poojawa, player) {
  2344. return poojawa.flags.state == "stomach";
  2345. },
  2346. function(poojawa, player) {
  2347. return player.health / player.maxHealth < 0.2;
  2348. }
  2349. ],
  2350. priority: 1,
  2351. weight: function(poojawa, player) { return player.prefs.vore.soul; },
  2352. gameover: function() { return "Body and soul melted down and absorbed into Poojawa's belly"; }
  2353. };
  2354. }