public void affect(Actor a) {
    //
    //  Impose penalties/bonuses to various attributes, if still symptomatic-
    final float
      progress = a.traits.traitLevel(this),
      response = 0 - a.traits.effectBonus(this),
      symptoms = progress - response ;
    
    if (reportEffects && I.talkAbout == a) {
      I.say(this+" has symptoms: "+symptoms) ;
      //new Exception().printStackTrace() ;
    }
    //  ...Shoot.  It really does seem to be potentially fatal.
    
    if (symptoms > 0) for (int i = affected.length ; i-- > 0 ;) {
      final float impact = modifiers[i] * symptoms / 2 ;
      if (reportEffects && I.talkAbout == a) {
        I.say("Affecting: "+affected[i]+", impact: "+impact) ;
        I.say("Normal level: "+a.traits.traitLevel(affected[i])) ;
      }
      a.traits.incBonus(affected[i], impact) ;
    }
    //
    //  Check to see if the condition spreads/worsens or fades-
    if (virulence > 0) {
      affectAsDisease(a, progress, response) ;
    }
    else {
      final float inc = 1 * 1f / (latency * World.STANDARD_DAY_LENGTH) ;
      a.traits.setLevel(this, Math.max(0, progress - inc)) ;
    }
  }