public function apply(Player $player, Boss $boss, $turns)
 {
     $boss->inflictDamage(3);
     if ($boss->isDead()) {
         return;
     }
 }
 protected function simulateHarderBattle($health, $mana, $bossStats)
 {
     $numberOfRecharge = 0;
     $numberOfShield = 0;
     $numberOfDrain = 0;
     $iterations = 0;
     $shieldFailed = true;
     while (true) {
         $iterations++;
         $player = new PlayerTwo($health, $mana, $numberOfRecharge, $numberOfShield, $numberOfDrain, $this->output);
         $boss = new Boss($bossStats['Hit Points'], $bossStats['Damage'], $this->output);
         $effects = new EffectTracker($player, $boss);
         $spells = [];
         try {
             while (true) {
                 $player->reduceHealth(1);
                 if ($player->isDead()) {
                     break;
                 }
                 $effects->apply();
                 if ($boss->isDead()) {
                     break;
                 }
                 $spell = $player->findBestSpellToCast($boss, $effects);
                 $spells[] = get_class($spell);
                 $spell->cast($player, $boss, $effects);
                 $effects->apply();
                 if ($boss->isDead()) {
                     break;
                 }
                 $boss->attack($player);
                 if ($player->isDead()) {
                     break;
                 }
             }
         } catch (OutOfManaException $e) {
             $numberOfRecharge++;
             continue;
         }
         if ($boss->isDead()) {
             break;
         }
         if ($shieldFailed === false) {
             $numberOfDrain++;
             $shieldFailed = true;
         } else {
             $numberOfShield++;
             $shieldFailed = false;
         }
         $numberOfRecharge = 0;
     }
     return $player->getManaSpent();
 }