public float stressPenalty() {
    if (stressCache != -1) return stressCache ;
    if (! organic()) return stressCache = 0 ;
    
    float sumDisease = 0 ;
    for (Trait t : Abilities.TREATABLE_CONDITIONS) {
      sumDisease += ((Condition) t).virulence * actor.traits.traitLevel(t) ;
    }
    float sum = Visit.clamp((fatigue + injury) / maxHealth, 0, 1) ;
    final float hunger = (1 - (calories / maxHealth)) + (1 - nutrition) ;
    if (hunger > 0.5f) sum += hunger - 0.5f ;
    if (bleeds) sum += 0.25f ;
    sum += sumDisease / 100f ;
    sum -= moraleLevel() + 0.25f ;
    
    if (sum < 0) return stressCache = 0 ;
    return stressCache = Visit.clamp(sum * sum, 0, 0.5f) ;
  }