public float priorityFor(Actor actor) {
    if (storeShortage() <= 0) {
      if (sumHarvest() > 0) return Plan.ROUTINE ;
      else done = true ;
    }
    final float hunger = actor.health.hungerLevel() ;
    if (store == null && hunger <= 0) done = true ;
    if (done) return 0 ;
    
    float impetus = 0 ;
    impetus += hunger * Plan.PARAMOUNT ;
    impetus *= actor.traits.chance(CULTIVATION, MODERATE_DC) ;
    impetus *= actor.traits.chance(HARD_LABOUR, ROUTINE_DC) ;
    if (hunger > 0.5f) {
      final float scale = (hunger - 0.5f) * 2 ;
      impetus = (impetus * (1 - scale)) + (PARAMOUNT * scale) ;
    }
    
    if (source == null || source.destroyed()) {
      source = Forestry.findCutting(actor) ;
      if (source == null) return 0 ;
    }
    impetus -= Plan.rangePenalty(actor, source) ;
    impetus -= Plan.dangerPenalty(source, actor) ;
    impetus += priorityMod ;
    
    return impetus ;
  }