private void doDamageTo(
    Element e, float maxDamage, float radiation, float maxRange
  ) {
    final float dist = Spacing.distance(this, e) / maxRange ;
    final float damage = maxDamage * (1 - dist) ;

    if (e instanceof Wreckage) return ;
    else if (e instanceof Installation) {
      I.say("Doing "+damage+" to "+e) ;
      ((Installation) e).structure().takeDamage(damage) ;
    }
    else if (e instanceof Actor) {
      final Actor a = (Actor) e ;
      a.health.takeInjury(damage / 2f) ;
      a.traits.setLevel(POISONED, radiation / 25f) ;
      if (Rand.index(100) < radiation) a.traits.incLevel(CANCER, Rand.num()) ;
      if (Rand.index(100) < radiation) a.traits.incLevel(MUTATION, Rand.num()) ;
    }
    else {
      final float bulk = e.radius() * e.radius() * 4 * (e.height() + 0.5f) ;
      if ((Rand.num() * bulk) < damage / 10) e.setAsDestroyed() ;
    }
  }