public long getPositionPenalty(final Level level, final Player player) {
		final Position playerPos = player.getPos();
		final int playerRoad = playerPos.getRoadIndex();

		// Figure out the following:
		// 1. Which roads the player must still travel to, at a minimum, in
		// order to complete the level.
		// 2. Which _fixed_ targets the player must reach on those other roads,
		// where, "fixed," basically means, "not an active Koopa."
		// 3. Which fixed targets the player must reach on the current road.
		final Set<Integer> roadsToReach = new LinkedHashSet<>();
		final Multimap<Integer, Object> targetsOnRoads = LinkedHashMultimap
				.create();
		final List<Object> targetsOnCurrentRoad = new ArrayList<>();

		for (Koopa koopa : level.getArtifactHolders()) {
			final int koopaRoad = koopa.getCurrentPos().getRoadIndex();
			if ((koopa.getStatus() != Status.CARRIED)
					&& (koopaRoad != playerRoad)) {
				roadsToReach.add(koopaRoad);
			}
			if (koopa.getStatus() == Status.STOMPED) {
				if (koopaRoad == playerRoad) {
					targetsOnCurrentRoad.add(koopa);
				} else {
					targetsOnRoads.put(koopaRoad, koopa);
				}
			}
		}
		for (Kiosk kiosk : level.getKiosks()) {
			if (kiosk.isCompleted()) {
				continue;
			}

			final int kioskRoad = kiosk.getBasePos().getRoadIndex();
			if (kioskRoad == playerRoad) {
				targetsOnCurrentRoad.add(kiosk);
			} else {
				roadsToReach.add(kioskRoad);
				targetsOnRoads.put(kioskRoad, kiosk);
			}
		}

		// Having done that, we can add the following penalties:
		//
		// 1. The player needs to cross at least as many transitions as there
		// are roads to reach. Also, if the player has nowhere else to go on the
		// current road, the player has to get to a transition to leave. If the
		// player does have somewhere to go, we'll ignore the second part in
		// case that other thing is on the way to a transition.
		final long roadLeavingPenalty = (targetsOnCurrentRoad.isEmpty()) ? (getDistanceTo(
				getNearestTransition(level, playerPos), playerPos) / RUN_SPEED_ESTIMATE)
				: 0;
		final long transitionPenalty = (TRANSITION_ESTIMATE * roadsToReach
				.size()) + roadLeavingPenalty;

		// 2. The player needs to run to whatever kiosks/etc. haven't yet been
		// dealt with on each road. We'll underestimate this a lot to be safe,
		// but we can still do a little with it.
		final long remoteTargetPenalty = getRemoteTargetPenalty(targetsOnRoads,
				level);
		return transitionPenalty + remoteTargetPenalty;
	}