crunch
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

203 line
6.8 KiB

  1. function KuroLuxray() {
  2. Creature.call(this, "Kuro", 20, 40, 20);
  3. this.hasName = true;
  4. this.description = function() { return "Kuro"; };
  5. this.attacks = [];
  6. this.attacks.push(kuroPounce(this));
  7. this.attacks.push(kuroSit(this));
  8. this.attacks.push(kuroBat(this));
  9. this.attacks.push(kuroLick(this));
  10. //this.attacks.push(kuroKnead(this));
  11. //this.attacks.push(kuroSlideSit(this));
  12. this.attacks.push(kuroOralVore(this));
  13. this.attacks.push(kuroSmother(this));
  14. this.attacks.push(kuroAnalVore(this));
  15. //this.attacks.push(kuroSwallow(this));
  16. //this.attacks.push(kuroAnalPull(this));
  17. //this.attacks.push(kuroAnalSqueeze(this));
  18. //this.attacks.push(kuroAnalRest(this));
  19. //this.attacks.push(kuroDigest(this));
  20. this.flags.state = "chase";
  21. this.flags.distance = 6;
  22. this.playerAttacks = [];
  23. this.playerAttacks.push(pass);
  24. this.prefs.prey = false;
  25. }
  26. function kuroBat(attacker) {
  27. return {
  28. attackPlayer: function(defender) {
  29. let line = "The Luxray leaps towards you and smacks you with his heavy paw. ";
  30. let choice = Math.random();
  31. if (choice < 0.4) {
  32. player.changeStamina(-25);
  33. line += "You're knocked sideways, tossed into the wall! The impact dazes you for a moment.";
  34. } else if (choice < 0.75) {
  35. player.changeStamina(-15);
  36. let distance = Math.round(Math.random()*2+1);
  37. attacker.flags.distance += distance;
  38. line += "You tumble backwards, tossed between the lion's legs and thrown backward " + (distance == 1 ? "a foot" : "two feet") + ".";
  39. } else {
  40. player.changeStamina(-15);
  41. attacker.flags.distance -= 1;
  42. line += "He bats you from behind, sending you tumbling a foot forward.";
  43. }
  44. return [line];
  45. },
  46. requirements: [
  47. function(attacker, defender) {
  48. return attacker.flags.state == "chase";
  49. }
  50. ],
  51. priority: 1,
  52. weight: function() { return 1; }
  53. };
  54. }
  55. function kuroPounce(attacker) {
  56. return {
  57. attackPlayer: function(defender) {
  58. let result = statHealthCheck(attacker, defender, "dex");
  59. if (result) {
  60. attacker.flags.state = "paws";
  61. return ["A scrape of claws on concrete precedes the looming shadow of the lion. You turn and gasp in surprise, trying to dive out of the way as he comes hurtling down towards you - but it's too late. Kuro lands hard on his forepaws, pinning you to the cold, damp pavement and smothering your body in those weighty toes."];
  62. } else {
  63. return ["You hear the Luxray's claws scrape on the pavement as he pounces. It's just enough of a warning for you to dive out of the way. Heavy paws thump down on the ground, narrowly missing your body as you roll and get back to your feet."];
  64. }
  65. },
  66. requirements: [
  67. function(attacker, defender) {
  68. return attacker.flags.state == "chase";
  69. }
  70. ],
  71. priority: 1,
  72. weight: function() { return 1; }
  73. };
  74. }
  75. function kuroSit(attacker) {
  76. return {
  77. attackPlayer: function(defender) {
  78. let success = statHealthCheck(attacker, defender, "dex");
  79. if (success) {
  80. attacker.flags.state = "sit";
  81. return ["You gasp as the Luxray saunters over you, his regal body blotting out the light from above. It seems like he's just...walking past? You slow and stop, gazing upward as his black-and-yellow body walks by - chest, then belly, then his half-erect shaft, and then...<i>WHUMP</i>. His hind legs bend as his hips slam down on your body, pinning you up against his heavy ass. A hot, musk-tinged pucker grinds over your snout as he lets out a satisfied <i>purr.</i>"];
  82. } else {
  83. return ["You gasp as the Luxray saunters right onto you - tongue lolling from his parted jaws, eyes briefly making contact with yours - before his head becomes obscured by his regal chest and belly. For a brief moment, you think he's just letting you go...and then you realize what's about to happen, lunging to the side a heartbeat before his hips slam down on the ground. A delighted purr is cut short as he looks to the side and sees you stumbling to your feet; the Luxray rises back up and snarls. He really does want you..."];
  84. }
  85. },
  86. requirements: [
  87. function(attacker, defender) {
  88. return attacker.flags.state == "chase";
  89. }
  90. ],
  91. priority: 1,
  92. weight: function() { return 1; }
  93. };
  94. }
  95. function kuroLick(attacker) {
  96. return {
  97. attackPlayer: function(defender) {
  98. defender.changeStamina(-25);
  99. return ["The big cat's hot, pink tongue drags over your body as he savors your little squirmy body."];
  100. },
  101. requirements: [
  102. function(attacker, defender) {
  103. return attacker.flags.state == "paws";
  104. }
  105. ],
  106. priority: 1,
  107. weight: function(attacker, defender) { return defender.staminaPercentage(); }
  108. };
  109. }
  110. function kuroOralVore(attacker) {
  111. return {
  112. attackPlayer: function(defender) {
  113. attacker.flags.state = "oral";
  114. return ["Pinned and helpless, you can do little but squirm as the big cat's jaws lower to envelop you...hot, slimy tongue curling under your pinned body, cradling you in muscle and easing you into that powerful maw. He suckles on you for a long minute, sloshing you from side to side - savoring your fear, no doubt."];
  115. },
  116. requirements: [
  117. function(attacker, defender) {
  118. return attacker.flags.state == "paws";
  119. },
  120. function(attacker, defender) {
  121. return defender.prefs.prey && defender.prefs.vore.oral > 0;
  122. }
  123. ],
  124. priority: 1,
  125. weight: function() { return 1 - defender.staminaPercentage(); }
  126. };
  127. }
  128. function kuroSmother(attacker) {
  129. return {
  130. attackPlayer: function(defender) {
  131. defender.changeStamina(-45);
  132. return ["Kuro's ass grinds over your pinned body, knocking the wind from your lungs"];
  133. },
  134. requirements: [
  135. function(attacker, defender) {
  136. return attacker.flags.state == "sit";
  137. }
  138. ],
  139. priority: 1,
  140. weight: function(attacker, defender) { return defender.staminaPercentage(); }
  141. };
  142. }
  143. function kuroAnalVore(attacker) {
  144. return {
  145. attackPlayer: function(defender) {
  146. attacker.flags.state = "anal";
  147. return ["The heavy cat's weight shifts and slides...and his soft pucker takes you in. He eases himself down just an inch or two, enough to slide you entirely within...churring and swishing his tail as you're locked into his bitter, musky bowels."];
  148. },
  149. requirements: [
  150. function(attacker, defender) {
  151. return attacker.flags.state == "sit";
  152. },
  153. function(attacker, defender) {
  154. return defender.prefs.prey && defender.prefs.vore.anal > 0;
  155. }
  156. ],
  157. priority: 1,
  158. weight: function() { return 1; }
  159. };
  160. }
  161. function template(attacker) {
  162. return {
  163. attackPlayer: function(defender) {
  164. },
  165. requirements: [
  166. ],
  167. priority: 1,
  168. weight: function() { return 1; }
  169. };
  170. }