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

301 wiersze
9.5 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 doComp(attackStat, defendStat) {
  14. return Math.random() * attackStat > Math.random() * defendStat;
  15. }
  16. function statCheck(attacker, defender, stat) {
  17. return doComp(attacker[stat], defender[stat]);
  18. }
  19. function statHealthCheck(attacker, defender, stat) {
  20. let attackerPercent = attacker.health / attacker.maxHealth;
  21. let defenderPercent = defender.health / defender.maxHealth;
  22. return doComp(attacker[stat] * attackerPercent, defender[stat] * defenderPercent);
  23. }
  24. function punchAttack(attacker) {
  25. return {
  26. name: "Punch",
  27. desc: "Punch a nerd",
  28. attack: function(defender) {
  29. return "You punch the " + defender.description() + " for " + attack(attacker, defender, attacker.str) + " damage";
  30. },
  31. attackPlayer: function(defender) {
  32. return "The " + attacker.description() + " punches you for " + attack(attacker, defender, attacker.str) + " damage";
  33. }, requirements: [
  34. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  35. ],
  36. priority: 1,
  37. };
  38. }
  39. function flankAttack(attacker) {
  40. return {
  41. name: "Flank",
  42. desc: "Be sneaky",
  43. attack: function(defender) {
  44. return "You run around the " + defender.description() + " and attack for " + attack(attacker, defender, attacker.dex) + " damage";
  45. },
  46. attackPlayer: function(defender) {
  47. return "The " + attacker.description() + " runs past you, then turns and hits you for " + attack(attacker, defender, attacker.str) + " damage";
  48. }, requirements: [
  49. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  50. ],
  51. priority: 1,
  52. };
  53. }
  54. function grapple(attacker) {
  55. return {
  56. name: "Grapple",
  57. desc: "Try to grab your opponent",
  58. attack: function(defender) {
  59. let success = statHealthCheck(attacker, defender, "str");
  60. if (success) {
  61. defender.grappled = true;
  62. return "You charge at the " + defender.description() + ", tackling them and knocking them to the ground.";
  63. } else {
  64. return "You charge at the " + defender.description() + ", but they dodge out of the way!";
  65. }
  66. },
  67. attackPlayer: function(defender) {
  68. let success = Math.random() < 0.5;
  69. if (success) {
  70. defender.grappled = true;
  71. return "The " + attacker.description() + " lunges at you, pinning you to the floor!";
  72. } else {
  73. return "The " + attacker.description() + " tries to tackle you, but you deftly avoid them.";
  74. }
  75. },
  76. requirements: [
  77. function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
  78. ],
  79. priority: 1,
  80. };
  81. }
  82. function grappleDevour(attacker) {
  83. return {
  84. name: "Devour",
  85. desc: "Try to consume your grappled opponent",
  86. attack: function(defender) {
  87. let success = statHealthCheck(attacker, defender, "str");
  88. if (success) {
  89. attacker.stomach.feed(defender);
  90. defender.grappled = false;
  91. changeMode("explore");
  92. return "You open your jaws wide, stuffing the " + defender.description() + "'s head into your gullet and greedily wolfing them down. Delicious.";
  93. } else {
  94. return "Your jaws open wide, but the " + defender.description() + " manages to avoid becoming " + attacker.species + " chow.";
  95. }
  96. },
  97. attackPlayer: function(defender) {
  98. let success = statHealthCheck(attacker, defender, "str");
  99. if(success) {
  100. defender.grappled = false;
  101. changeMode("eaten");
  102. return "The " + attacker.description() + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp.";
  103. } else {
  104. return "The " + attacker.description() + " tries to swallow you down, but you manage to resist their hunger.";
  105. }
  106. }, requirements: [
  107. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  108. ], conditions: [
  109. function(prefs, player=false) { return player || prefs.player.prey; }
  110. ],
  111. priority: 1,
  112. };
  113. }
  114. function grappleAnalVore(attacker) {
  115. return {
  116. name: "Anal Vore",
  117. desc: "Try to shove your opponent up your ass.",
  118. attack: function(defender) {
  119. let success = statHealthCheck(attacker, defender, "str");
  120. if (success) {
  121. attacker.butt.feed(defender);
  122. defender.grappled = false;
  123. changeMode("explore");
  124. 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...";
  125. } else {
  126. return "Your grasp and shove the " + defender.description() + ", but they manage to avoid becoming " + attacker.species + " chow.";
  127. }
  128. }, requirements: [
  129. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  130. ], conditions: [
  131. function(prefs, player=false) { return player || prefs.player.prey; }
  132. ],
  133. priority: 1,
  134. };
  135. }
  136. function grappleRelease(attacker) {
  137. return {
  138. name: "Release",
  139. desc: "Release your opponent",
  140. attack: function(defender) {
  141. defender.grappled = false;
  142. return "You throw the " + defender.description() + " back, dealing " + attack(attacker, defender, attacker.str*1.5) + " damage";
  143. }, requirements: [
  144. function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
  145. ],
  146. priority: 1,
  147. };
  148. }
  149. function grappledStruggle(attacker) {
  150. return {
  151. name: "Struggle",
  152. desc: "Try to break your opponent's pin",
  153. attack: function(defender) {
  154. let success = statHealthCheck(attacker, defender, "str");
  155. if (success) {
  156. attacker.grappled = false;
  157. return "You struggle and shove the " + defender.description() + " off of you.";
  158. } else {
  159. return "You struggle, but to no avail.";
  160. }
  161. },
  162. attackPlayer: function(defender) {
  163. let success = statHealthCheck(attacker, defender, "str");
  164. if (success) {
  165. attacker.grappled = false;
  166. return "Your prey shoves you back, breaking your grapple!";
  167. } else {
  168. return "Your prey squirms, but remains pinned.";
  169. }
  170. },
  171. requirements: [
  172. function(attacker, defender) { return isGrappled(attacker) && isNormal(defender); }
  173. ],
  174. priority: 1,
  175. };
  176. }
  177. function grappledReverse(attacker) {
  178. return {
  179. name: "Reversal",
  180. desc: "Try to pin your grappler. Less likely to work than struggling.",
  181. attack: function(defender) {
  182. let success = statHealthCheck(attacker, defender, "str");
  183. if (success) {
  184. attacker.grappled = false;
  185. defender.grappled = true;
  186. return "You surprise the " + defender.description() + " with a burst of strength, flipping them over and pinning them.";
  187. } else {
  188. return "You try to throw your opponent off of you, but fail.";
  189. }
  190. },
  191. attackPlayer: function(defender) {
  192. let success = statHealthCheck(attacker, defender, "str");
  193. if (success) {
  194. attacker.grappled = false;
  195. defender.grappled = true;
  196. return "Your prey suddenly grabs hold and flips you over, pinning you!";
  197. } else {
  198. return "Your prey tries to grab at you, but you keep them under control.";
  199. }
  200. },
  201. requirements: [
  202. function(attacker, defender) { return isGrappled(attacker) && isNormal(defender); }
  203. ],
  204. priority: 1,
  205. };
  206. }
  207. function pass(attacker) {
  208. return {
  209. name: "Pass",
  210. desc: "You can't do anything!",
  211. attack: function(defender) {
  212. return "You do nothing.";
  213. },
  214. attackPlayer: function(defender) {
  215. return "The " + attacker.description() + " does nothing.";
  216. },
  217. priority: 0,
  218. };
  219. }
  220. function devourPlayer(attacker) {
  221. return {
  222. name: "Devours YOU!",
  223. desc: "You won't see this",
  224. conditions: [
  225. function(prefs) { return prefs.player.prey; }
  226. ],
  227. requirements: [
  228. function(attacker, defender) { return attacker.leering == true; }
  229. ],
  230. attackPlayer: function(defender) {
  231. changeMode("eaten");
  232. return "The voracious " + attacker.description() + " pins you down and devours you in seconds.";
  233. },
  234. priority: 1,
  235. };
  236. }
  237. function leer(attacker) {
  238. return {
  239. name: "Leer",
  240. desc: "Leer at something",
  241. attackPlayer: function(defender) {
  242. attacker.leering = true;
  243. return "The " + attacker.description() + " leers at you.";
  244. },
  245. requirements: [
  246. function(attacker, defender) { return attacker.leering != true && attacker.grappled != true; }
  247. ],
  248. priority: 1,
  249. };
  250. }
  251. function poke(attacker) {
  252. return {
  253. name: "Poke",
  254. desc: "Poke a nerd",
  255. attackPlayer: function(defender) {
  256. return "The " + attacker.description() + " pokes you on the snout for " + attack(attacker, defender, 1e12) + " damage";
  257. },
  258. priority: 1,
  259. };
  260. }
  261. function digestPlayerStomach(predator,damage=20) {
  262. return {
  263. digest: function(player) {
  264. attack(predator, player, damage);
  265. return "The " + predator.description() + "'s stomach grinds over your body, swiftly digesting you.";
  266. },
  267. priority: 1,
  268. };
  269. }
  270. function instakillPlayerStomach(pedator) {
  271. return {
  272. digest: function(player) {
  273. player.health = -100;
  274. return "The stomach walls churn, clench, and swiftly crush you into nothingnes.";
  275. },
  276. priority: 1,
  277. weight: function(attacker, defender) { return 1/3 },
  278. };
  279. }