munch
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.
 
 
 

232 lines
7.6 KiB

  1. "use strict";
  2. function attack(attacker, defender, baseDamage) {
  3. let damage = Math.round((Math.random() * 0.5 - 0.25 + 1) * baseDamage);
  4. defender.health -= damage;
  5. return damage;
  6. }
  7. function isNormal(entity) {
  8. return entity.grappled != true;
  9. }
  10. function isGrappled(entity) {
  11. return entity.grappled == true;
  12. }
  13. function punchAttack(attacker) {
  14. return {
  15. name: "Punch",
  16. desc: "Punch a nerd",
  17. attack: function(defender) {
  18. return "You punch the " + defender.description() + " for " + attack(attacker, defender, attacker.str) + " damage";
  19. },
  20. attackPlayer: function(defender) {
  21. return "The " + attacker.description() + " punches you for " + attack(attacker, defender, attacker.str) + " damage";
  22. }, requirements: [
  23. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  24. ]
  25. };
  26. }
  27. function flankAttack(attacker) {
  28. return {
  29. name: "Flank",
  30. desc: "Be sneaky",
  31. attack: function(defender) {
  32. return "You run around the " + defender.description() + " and attack for " + attack(attacker, defender, attacker.dex) + " damage";
  33. },
  34. attackPlayer: function(defender) {
  35. return "The " + attacker.description() + " runs past you, then turns and hits you for " + attack(attacker, defender, attacker.str) + " damage";
  36. }, requirements: [
  37. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  38. ]
  39. };
  40. }
  41. function grapple(attacker) {
  42. return {
  43. name: "Grapple",
  44. desc: "Try to grab your opponent",
  45. attack: function(defender) {
  46. let success = Math.random() < 0.5;
  47. if (success) {
  48. defender.grappled = true;
  49. return "You charge at the " + defender.description() + ", tackling them and knocking them to the ground.";
  50. } else {
  51. return "You charge at the " + defender.description() + ", but they dodge out of the way!";
  52. }
  53. },
  54. attackPlayer: function(defender) {
  55. let success = Math.random() < 0.5;
  56. if (success) {
  57. defender.grappled = true;
  58. return "The " + attacker.description() + " lunges at you, pinning you to the floor!";
  59. } else {
  60. return "The " + attacker.description() + " tries to tackle you, but you deftly avoid them.";
  61. }
  62. },
  63. requirements: [
  64. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  65. ]
  66. };
  67. }
  68. function grappleDevour(attacker) {
  69. return {
  70. name: "Devour",
  71. desc: "Try to consume your grappled opponent",
  72. attack: function(defender) {
  73. let success = Math.random() < 0.25 + (1 - defender.health / defender.maxHealth) * 0.75;
  74. if (success) {
  75. attacker.stomach.feed(defender);
  76. defender.grappled = false;
  77. changeMode("explore");
  78. return "You open your jaws wide, stuffing the " + defender.description() + "'s head into your gullet and greedily wolfing them down. Delicious.";
  79. } else {
  80. return "Your jaws open wide, but the " + defender.description() + " manages to avoid becoming " + attacker.species + " chow.";
  81. }
  82. },
  83. attackPlayer: function(defender) {
  84. let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5 && Math.random() < 0.5;
  85. if(success) {
  86. defender.grappled = false;
  87. changeMode("eaten");
  88. return "The " + attacker.description() + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp.";
  89. } else {
  90. return "The " + attacker.description() + " tries to swallow you down, but you manage to resist their hunger.";
  91. }
  92. }, requirements: [
  93. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  94. ], conditions: [
  95. function(prefs, player=false) { return player || prefs.player.prey; }
  96. ]
  97. };
  98. }
  99. function grappleAnalVore(attacker) {
  100. return {
  101. name: "Anal Vore",
  102. desc: "Try to shove your opponent up your ass.",
  103. attack: function(defender) {
  104. let success = Math.random() < 0.25 + (1 - defender.health / defender.maxHealth) * 0.75;
  105. if (success) {
  106. attacker.butt.feed(defender);
  107. defender.grappled = false;
  108. changeMode("explore");
  109. return "You shove the " + defender.description() + " between your cheeks. Their head slips into your ass with a wet <i>shlk</i>, and the rest of their body follows suit. You moan and gasp, working them deeper and deeper...";
  110. } else {
  111. return "Your grasp and shove the " + defender.description() + ", but they manage to avoid becoming " + attacker.species + " chow.";
  112. }
  113. }, requirements: [
  114. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  115. ], conditions: [
  116. function(prefs, player=false) { return player || prefs.player.prey; }
  117. ]
  118. };
  119. }
  120. function grappleRelease(attacker) {
  121. return {
  122. name: "Release",
  123. desc: "Release your opponent",
  124. attack: function(defender) {
  125. defender.grappled = false;
  126. return "You throw the " + defender.description() + " back, dealing " + attack(attacker, defender, attacker.str*1.5) + " damage";
  127. }, requirements: [
  128. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  129. ]
  130. };
  131. }
  132. function grappledStruggle(attacker) {
  133. return {
  134. name: "Struggle",
  135. desc: "Try to break your opponent's pin",
  136. attack: function(defender) {
  137. let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5;
  138. if (success) {
  139. attacker.grappled = false;
  140. return "You struggle and shove the " + defender.description() + " off of you.";
  141. } else {
  142. return "You struggle, but to no avail.";
  143. }
  144. },
  145. attackPlayer: function(defender) {
  146. let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5 && Math.random() < 0.5;
  147. if (success) {
  148. attacker.grappled = false;
  149. return "Your prey shoves you back, breaking your grapple!";
  150. } else {
  151. return "Your prey squirms, but remains pinned.";
  152. }
  153. },
  154. requirements: [
  155. function(attacker, defender) { return isGrappled(attacker) && isNormal(defender); }
  156. ]
  157. };
  158. }
  159. function pass(attacker) {
  160. return {
  161. name: "Pass",
  162. desc: "You can't do anything!",
  163. attack: function(defender) {
  164. return "You do nothing.";
  165. },
  166. attackPlayer: function(defender) {
  167. return "The " + attacker.description() + " does nothing.";
  168. }
  169. };
  170. }
  171. function devourPlayer(attacker) {
  172. return {
  173. name: "Devours YOU!",
  174. desc: "You won't see this",
  175. conditions: [
  176. function(prefs) { return prefs.player.prey; }
  177. ],
  178. requirements: [
  179. function(attacker, defender) { return attacker.leering == true; }
  180. ],
  181. attackPlayer: function(defender) {
  182. changeMode("eaten");
  183. return "The voracious " + attacker.description() + " pins you down and devours you in seconds.";
  184. }
  185. };
  186. }
  187. function leer(attacker) {
  188. return {
  189. name: "Leer",
  190. desc: "Leer at something",
  191. attackPlayer: function(defender) {
  192. attacker.leering = true;
  193. return "The " + attacker.description() + " leers at you.";
  194. },
  195. requirements: [
  196. function(attacker, defender) { return attacker.leering != true && attacker.grappled != true; }
  197. ]
  198. };
  199. }
  200. function poke(attacker) {
  201. return {
  202. name: "Poke",
  203. desc: "Poke a nerd",
  204. attackPlayer: function(defender) {
  205. return "The " + attacker.description() + " pokes you on the snout for " + attack(attacker, defender, 1e12) + " damage";
  206. }
  207. };
  208. }
  209. function digestPlayerStomach(predator,damage=20) {
  210. return {
  211. digest: function(player) {
  212. attack(predator, player, damage);
  213. return "The " + predator.description() + "'s stomach grinds over your body, swiftly digesting you.";
  214. }
  215. };
  216. }