private void updateStresses() {
    if (state >= STATE_SUSPEND || ! organic()) return ;
    final float DL = World.STANDARD_DAY_LENGTH ;
    float MM = 1, FM = 1, IM = 1, PM = 1 ;
    //
    //  Regeneration rates differ during sleep-
    if (state == STATE_RESTING) {
      FM = -3 ;
      IM =  2 ;
      MM =  1 ;
      PM =  0 ;
    }
    else if (actor.currentAction() != null) {
      FM *= Action.moveRate(actor, true) ;
    }
    if (bleeds) {
      injury++ ;
      if (actor.traits.test(VIGOUR, 10, 1) && Rand.num() < STABILISE_CHANCE) {
        bleeds = false ;
      }
    }
    else injury -= INJURY_REGEN_PER_DAY * maxHealth * IM / DL ;
    fatigue += FATIGUE_GROW_PER_DAY * baseSpeed * maxHealth * FM / DL ;
    fatigue = Visit.clamp(fatigue, 0, MAX_FATIGUE * maxHealth) ;
    injury = Visit.clamp(injury, 0, (MAX_INJURY + 1) * maxHealth) ;
    //
    //  Have morale converge to a default based on the cheerful trait and
    //  current stress levels.
    final float
      stress = stressPenalty(),
      defaultMorale = actor.traits.traitLevel(OPTIMISTIC) / 10f,
      moraleInc = MORALE_DECAY_PER_DAY * MM / DL ;
    morale = (morale * (1 - moraleInc)) + (defaultMorale * moraleInc) ;
    morale -= stress / DL ;
    //
    //  Last but not least, update your psy points-
    final float maxPsy = maxPsy() ;
    psyPoints += maxPsy * (1 - stress) * PM / PSY_REGEN_TIME ;
    psyPoints = Visit.clamp(psyPoints, 0, maxPsy) ;
  }