protected void updateAction(boolean active) {
    if (verbose) I.sayAbout(actor, "Updating action: "+progress) ;
    if (finished()) {
      oldProgress = progress = 1 ;
      return ;
    }
    else {
      oldProgress = progress ;
      updateMotion(active) ;
    }
    if (inRange == 1) {
      progress += 1f / (actionDuration() * PlayLoop.UPDATES_PER_SECOND) ;
      progress = Visit.clamp(progress, 0, 1) ;
      final float duration = actionDuration() ;
      final float contact = (duration - 0.25f) / duration ;
      if (oldProgress <= contact && progress > contact) applyEffect() ;
    }
    if (inRange == 0) progress += (
      moveRate(actor, false) *
      actor.moveAnimStride() /
      PlayLoop.UPDATES_PER_SECOND
    ) ;
  }