public ColonyTile getVacantColonyTileFor(Unit unit, boolean allowClaim,
                                             GoodsType... goodsTypes) {
        ColonyTile best = null;
        int bestProd = 0;
        for (ColonyTile colonyTile : colonyTiles) {
            Tile workTile = colonyTile.getWorkTile();
            switch (colonyTile.getNoAddReason(unit)) {
            case CLAIM_REQUIRED:
                if (owner.getLandPrice(workTile) < 0) allowClaim = false;
                // Fall through.
            case NONE: case ALREADY_PRESENT:
                if (workTile.getOwningSettlement() != this
                    && !allowClaim) break;
                for (GoodsType goodsType : goodsTypes) {
                    int prod = colonyTile.getPotentialProduction(goodsType,
                        unit.getType());
                    if (prod > bestProd) {
                        bestProd = prod;
                        best = colonyTile;
                    }
                }
                break;
            default:
                break;
            }
        }
        return best;
    }