@Override
   public DamageReport hit(double damage, Class<? extends Tower> towerClass) {
      if(!alive) {
         return null;
      }
      damage *= calculateMultiTowerBonus(towerClass);
      double adjustedDamage = damage;
      if(adjustedDamageTicksLeft > 0) {
         adjustedDamage *= damageMultiplier;
      }
      if (hp - adjustedDamage <= 0) {
         // This hit killed the creep, so the damage dealt is the number of hp the creep had left,
         // not the raw damage of the hit
         alive = false;
         double damageToReport = hp;
         boolean wasKill = true;
         if(adjustedDamageNotifier != null && adjustedDamage > damage && hp > damage) {
            // Notify the tower that caused the extra damage of the damage it caused
            // Note that it only caused extra damage if the original shot would not have killed this
            // creep.
            adjustedDamageNotifier.notifyOfDamage(hp - damage);
            adjustedDamageNotifier.notifyOfKills(1);
            
            damageToReport = damage;
            // Don't count it as a kill on the damage report
            wasKill = false;
         }
         double moneyEarned = Formulae.damageDollars(hp, hpFactor, currentLevel) +
               Formulae.killBonus(levelHP, currentLevel);
         return new DamageReport(damageToReport, moneyEarned, wasKill);
      } else {
         hp -= adjustedDamage;
         if(adjustedDamageNotifier != null && adjustedDamage > damage) {
            // Notify the tower that caused the extra damage of the damage it caused
            adjustedDamageNotifier.notifyOfDamage(adjustedDamage / damageMultiplier);
         }
         double moneyEarned = Formulae.damageDollars(adjustedDamage, hpFactor, currentLevel);
         // Only report the damage actually from this shot, not the extra
         return new DamageReport(damage, moneyEarned, false);
      }
   }