|  | "use strict";
function attack(attacker, defender, baseDamage) {
  let damage = Math.round((Math.random() * 0.5 - 0.25 + 1) * baseDamage);
  defender.health -= damage;
  return damage;
}
function isNormal(entity) {
  return entity.grappled != true;
}
function isGrappled(entity) {
  return entity.grappled == true;
}
function punchAttack(attacker) {
  return {
    name: "Punch",
    desc: "Punch a nerd",
    attack: function(defender) {
      return "You punch the " + defender.description() + " for " + attack(attacker, defender, attacker.str) + " damage";
    },
    attackPlayer: function(defender) {
      return "The " + attacker.description() + " punches you for " + attack(attacker, defender, attacker.str) + " damage";
    }, requirements: [
      function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
    ]
  };
}
function flankAttack(attacker) {
  return {
    name: "Flank",
    desc: "Be sneaky",
    attack: function(defender) {
      return "You run around the " + defender.description() + " and attack for " + attack(attacker, defender, attacker.dex) + " damage";
    },
    attackPlayer: function(defender) {
      return "The " + attacker.description() + " runs past you, then turns and hits you for " + attack(attacker, defender, attacker.str) + " damage";
    }, requirements: [
      function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
    ]
  };
}
function grapple(attacker) {
  return {
    name: "Grapple",
    desc: "Try to grab your opponent",
    attack: function(defender) {
      let success = Math.random() < 0.5;
      if (success) {
        defender.grappled = true;
        return "You charge at the " + defender.description() + ", tackling them and knocking them to the ground.";
      } else {
        return "You charge at the " + defender.description() + ", but they dodge out of the way!";
      }
    },
    attackPlayer: function(defender) {
      let success = Math.random() < 0.5;
      if (success) {
        defender.grappled = true;
        return "The " + attacker.description() + " lunges at you, pinning you to the floor!";
      } else {
        return "The " + attacker.description() + " tries to tackle you, but you deftly avoid them.";
      }
    },
    requirements: [
      function(attacker, defender) { return isNormal(attacker) && isNormal(defender); }
    ]
  };
}
function grappleDevour(attacker) {
  return {
    name: "Devour",
    desc: "Try to consume your grappled opponent",
    attack: function(defender) {
      let success = Math.random() < 0.25 + (1 - defender.health / defender.maxHealth) * 0.75;
      if (success) {
        attacker.stomach.feed(defender);
        defender.grappled = false;
        changeMode("explore");
        return "You open your jaws wide, stuffing the " + defender.description() + "'s head into your gullet and greedily wolfing them down. Delicious.";
      } else {
        return "Your jaws open wide, but the " + defender.description() + " manages to avoid becoming " + attacker.species + " chow.";
      }
    },
    attackPlayer: function(defender) {
      let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5 && Math.random() < 0.5;
      if(success) {
        defender.grappled = false;
        changeMode("eaten");
        return "The " + attacker.description() + " forces your head into their sloppy jaws, devouring you despite your frantic struggles. Glp.";
      } else {
        return "The " + attacker.description() + " tries to swallow you down, but you manage to resist their hunger.";
      }
    }, requirements: [
      function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
    ], conditions: [
      function(prefs, player=false) { return player || prefs.player.prey; }
    ]
  };
}
function grappleAnalVore(attacker) {
  return {
    name: "Anal Vore",
    desc: "Try to shove your opponent up your ass.",
    attack: function(defender) {
      let success = Math.random() < 0.25 + (1 - defender.health / defender.maxHealth) * 0.75;
      if (success) {
        attacker.butt.feed(defender);
        defender.grappled = false;
        changeMode("explore");
        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...";
      } else {
        return "Your grasp and shove the " + defender.description() + ", but they manage to avoid becoming " + attacker.species + " chow.";
      }
    }, requirements: [
      function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
    ], conditions: [
      function(prefs, player=false) { return player || prefs.player.prey; }
    ]
  };
}
function grappleRelease(attacker) {
  return {
    name: "Release",
    desc: "Release your opponent",
    attack: function(defender) {
      defender.grappled = false;
      return "You throw the " + defender.description() + " back, dealing " + attack(attacker, defender, attacker.str*1.5) + " damage";
    }, requirements: [
      function(attacker, defender) { return isNormal(attacker) && isGrappled(defender); }
    ]
  };
}
function grappledStruggle(attacker) {
  return {
    name: "Struggle",
    desc: "Try to break your opponent's pin",
    attack: function(defender) {
      let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5;
      if (success) {
        attacker.grappled = false;
        return "You struggle and shove the " + defender.description() + " off of you.";
      } else {
        return "You struggle, but to no avail.";
      }
    },
    attackPlayer: function(defender) {
      let success = Math.random() < 0.5 + (1 - defender.health / defender.maxHealth)*0.5 && Math.random() < 0.5;
      if (success) {
        attacker.grappled = false;
        return "Your prey shoves you back, breaking your grapple!";
      } else {
        return "Your prey squirms, but remains pinned.";
      }
    },
    requirements: [
      function(attacker, defender) { return isGrappled(attacker) && isNormal(defender); }
    ]
  };
}
function pass(attacker) {
  return {
    name: "Pass",
    desc: "You can't do anything!",
    attack: function(defender) {
      return "You do nothing.";
    },
    attackPlayer: function(defender) {
      return "The " + attacker.description() + " does nothing.";
    }
  };
}
function devourPlayer(attacker) {
  return {
    name: "Devours YOU!",
    desc: "You won't see this",
    conditions: [
      function(prefs) { return prefs.player.prey; }
    ],
    requirements: [
      function(attacker, defender) { return attacker.leering == true; }
    ],
    attackPlayer: function(defender) {
      changeMode("eaten");
      return "The voracious " + attacker.description() + " pins you down and devours you in seconds.";
    }
  };
}
function leer(attacker) {
  return {
    name: "Leer",
    desc: "Leer at something",
    attackPlayer: function(defender) {
      attacker.leering = true;
      return "The " + attacker.description() + " leers at you.";
    },
    requirements: [
      function(attacker, defender) { return attacker.leering != true && attacker.grappled != true; }
    ]
  };
}
function poke(attacker) {
  return {
    name: "Poke",
    desc: "Poke a nerd",
    attackPlayer: function(defender) {
      return "The " + attacker.description() + " pokes you on the snout for " + attack(attacker, defender, 1e12) + " damage";
    }
  };
}
function digestPlayerStomach(predator,damage=20) {
  return {
    digest: function(player) {
      attack(predator, player, damage);
      return "The " + predator.description() + "'s stomach grinds over your body, swiftly digesting you.";
    }
  };
}
 |