This commit is contained in:
33333-33333 2026-05-28 16:45:00 +09:00
commit c523bf4380
8 changed files with 76 additions and 26 deletions

View file

@ -96,7 +96,7 @@ function assignMunicipalityPopulations(adminCenters, adminId, fields, settlement
}
function promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCities, markets, adminCenters, fields, seed, minPopulation = 200000) {
function promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCities, markets, adminCenters, fields, seed, minPopulation = 200000, focusedPrefectureMask = null) {
if (!prefectureRegionId) return 0;
const prefIds = new Set();
for (let i = 0; i < prefectureRegionId.length; i++) {
@ -135,6 +135,24 @@ function promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCiti
if (!p || !inside(p.x, p.y)) return -1;
return prefectureRegionId[indexOf(p.x, p.y)] ?? -1;
}
const focusedPrefCounts = new Map();
if (focusedPrefectureMask) {
for (let i = 0; i < focusedPrefectureMask.length; i++) {
if (!focusedPrefectureMask[i] || sea[i]) continue;
const prefId = prefectureRegionId[i] ?? -1;
if (prefId >= 0) focusedPrefCounts.set(prefId, (focusedPrefCounts.get(prefId) || 0) + 1);
}
}
const focusedPrefId = focusedPrefCounts.size
? [...focusedPrefCounts.entries()].sort((a, b) => b[1] - a[1])[0][0]
: 0;
for (const city of modernCities || []) {
if (city.isPrefecturalCapital) {
city.isPrefecturalCapital = false;
city.rank = city.isRegionalCapital ? "Regional Capital" : city.population >= 200000 ? "Regional City" : "Local City";
city.kind = city.rank;
}
}
for (const prefId of [...prefIds].sort((a, b) => a - b)) {
const cities = (modernCities || []).filter((p) => prefAt(p) === prefId);
let target = cities.slice().sort((a, b) =>
@ -175,10 +193,10 @@ function promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCiti
target.population = promotedPopulation;
promoted++;
}
target.isPrefecturalCapital = true;
target.isRegionalCapital = true;
target.rank = "Prefectural Capital";
target.kind = "Prefectural Capital";
target.isPrefecturalCapital = prefId === focusedPrefId;
target.rank = target.isPrefecturalCapital ? "Prefectural Capital" : "Regional Capital";
target.kind = target.rank;
target.labelPriorityBase = Math.max(target.labelPriorityBase || 0, 1150);
target.urbanRadius = clamp(6.2 + Math.sqrt(target.population) / 80, 9, 30);
target.coreRadius = clamp(2.0 + Math.sqrt(target.population) / 390, 2.4, 6.4);
@ -480,6 +498,17 @@ export function finishMapOutput({
center.canonicalSettlementId = best.id;
center.canonicalSettlementName = best.name;
center.municipalityRootName = best.name;
const bestAdmin = adminId?.[indexOf(best.x, best.y)];
const canSnapOffice = inside(best.x, best.y) && !sea[indexOf(best.x, best.y)] && (
centerAdmin == null || centerAdmin < 0 || bestAdmin == null || bestAdmin < 0 || bestAdmin === centerAdmin
);
if (canSnapOffice) {
center.generatedOfficeX = center.generatedOfficeX ?? center.x;
center.generatedOfficeY = center.generatedOfficeY ?? center.y;
center.x = best.x;
center.y = best.y;
center.officeSnappedToSettlement = true;
}
} else {
center.municipalityRootName = center.generatedMunicipalityName;
}
@ -513,7 +542,7 @@ export function finishMapOutput({
center.municipalityName = candidate;
usedAdminNames.add(center.name);
}
const promotedPrefectureCapitals = promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCities, markets, adminCenters, nameFields, seed, 220000);
const promotedPrefectureCapitals = promotePrefectureCapitalPopulations(prefectureRegionId, sea, modernCities, markets, adminCenters, nameFields, seed, 220000, prefectureMask);
assignMunicipalityPopulations(adminCenters, adminId, nameFields, [
...modernCities,
...markets,