public static float moveRate(Actor actor, boolean basic) {
    int motionType = MOTION_NORMAL ; for (Behaviour b : actor.mind.agenda) {
      final int MT = b.motionType(actor) ;
      if (MT != MOTION_ANY) { motionType = MT ; break ; }
    }
    
    final float luck = actor.motionWalks() ? moveLuck(actor) : 0.5f ;
    float rate = actor.health.baseSpeed() ;
    if (motionType == MOTION_SNEAK) rate *= (2 - luck) / 4 ;
    else if (motionType == MOTION_FAST) rate *= 2 * luck ;
    else rate += (luck - 0.5f) / 2 ;
    if (basic) return rate ;
    
    //  TODO:  Must also account for the effects of fatigue and encumbrance...
    final int pathType = actor.origin().pathType() ;
    switch (pathType) {
      case (Tile.PATH_HINDERS) : rate *= 0.8f ; break ;
      case (Tile.PATH_CLEAR  ) : rate *= 1.0f ; break ;
      case (Tile.PATH_ROAD   ) : rate *= 1.2f ; break ;
    }
    return rate ;
  }