private static boolean hitHealMonster(Player p, ArrayList<Monster> monsters, int whichMonster, boolean atRange) {
    ArrayList<String> rAttacks = new ArrayList<String>();
    for(int i = 0; i < p.getUsableRangedAttacks().size(); i++) {
      rAttacks.add(p.getUsableRangedAttacks().get(i).toString());
    }
    ArrayList<String> mAttacks = new ArrayList<String>();
    for(int i = 0; i < p.getUsableMeleeAttacks().size(); i++) {
      mAttacks.add(p.getUsableMeleeAttacks().get(i).toString());
    }

    Damage damage;
    if(atRange) {
      damage = p.dealRangedDamage(UI.menu("please select your weapon", rAttacks));
    }
    else {
      damage = p.dealMeleeDamage(UI.menu("please select your weapon", mAttacks));
    }
    UI.out.println("you hit a " + monsters.get(whichMonster) + " for " + damage.getBlockable() + " damage and " + damage.getUnblockable() + " spite damage");
    int taken = monsters.get(whichMonster).takeDamage(damage);
    if(taken > 0) {
      UI.out.println("their armour cannot completely shield them and they take damage");
    }
    else {
      UI.out.println("alas, their defenses are too strong! you do not get through");
    }
    int healed = monsters.get(whichMonster).heal();
    if(healed > 0) {
      UI.out.println("unfortunately, the " + monsters.get(whichMonster) + " appears to have recovered a little");
    }
    if(monsters.get(whichMonster).getConstitution() <= 0) {
      UI.out.print("good job! you killed a " + monsters.get(whichMonster) + " and got " + monsters.get(whichMonster).getMonsterRating() + "xp!");
      p.addXP(monsters.remove(whichMonster).getMonsterRating());
      if(monsters.size() == 0) {
        UI.out.println("\n");
        return false;
      }
      else {
        UI.out.println(" now all that remains are");
        UI.printMonsters(monsters);
        UI.out.println("");
        return true;
      }
    }
    UI.out.println("");
    return true;
  }