This commit is contained in:
33333-33333 2026-05-22 02:11:18 +09:00
commit da9d8ef904
11 changed files with 612 additions and 344 deletions

View file

@ -72,10 +72,12 @@ export function finishMapOutput({
tributaryRivers,
smallStreams,
externalGateways,
transportDebug,
prefectureMask,
prefectureBorder,
prefectureRegionId,
regionalDebug,
terrainDebug,
regionalPrefectureBorders,
}) {
// Final population pass after land-use cleanup, satellite municipality locking, and isolated urban deletion.
@ -171,28 +173,59 @@ export function finishMapOutput({
center.name = best.name;
}
}
const adminNamePrefixes = ["\u6771", "\u897F", "\u5357", "\u5317", "\u4E0A", "\u4E0B", "\u65B0", "\u65E7", "\u4E2D", "\u5916"];
const adminNameSuffixes = [
"\u753A\u57DF",
"\u5E02\u57DF",
"\u90F7\u57DF",
"\u6D41\u57DF",
"\u6E7E\u5CB8",
"\u5C71\u9E93",
"\u5E73\u91CE",
"\u5730\u533A",
];
const adminNameCounts = new Map();
for (const center of adminCenters) adminNameCounts.set(center.name, (adminNameCounts.get(center.name) || 0) + 1);
const duplicateOrdinal = new Map();
const baseVariantCounts = new Map();
for (const center of adminCenters) {
if ((adminNameCounts.get(center.name) || 0) <= 1) continue;
const n = duplicateOrdinal.get(center.name) || 0;
duplicateOrdinal.set(center.name, n + 1);
const prefix = adminNamePrefixes[(Math.floor(center.x / Math.max(1, MAP_W / 3)) + Math.floor(center.y / Math.max(1, MAP_H / 3)) * 3 + n) % adminNamePrefixes.length];
if (!String(center.name).startsWith(prefix)) center.name = `${prefix}${center.name}`;
const base = String(center.name || "");
const count = adminNameCounts.get(base) || 0;
if (count <= 1) {
baseVariantCounts.set(base, Math.max(baseVariantCounts.get(base) || 0, 1));
continue;
}
const usedForBase = baseVariantCounts.get(base) || 0;
if (usedForBase === 0) {
baseVariantCounts.set(base, 1);
continue;
}
if (usedForBase < 2) {
const i = indexOf(center.x, center.y);
const naturalSuffix = coastalLowland[i] > 0.28
? "\u6E7E\u5CB8"
: basinField[i] > 0.28
? "\u5E73\u91CE"
: ridgeField[i] > 0.42 || slope[i] > 0.34
? "\u5C71\u9E93"
: river[i] > 0.25 || flowAccum[i] > 0.38
? "\u6D41\u57DF"
: adminNameSuffixes[(Math.floor(center.x / 12) + Math.floor(center.y / 12)) % adminNameSuffixes.length];
center.name = `${base}${naturalSuffix}`;
center.derivedFromBaseName = base;
nameDebug.derivedNameCount++;
baseVariantCounts.set(base, usedForBase + 1);
}
}
const usedAdminNames = new Set();
for (const center of adminCenters) {
let candidate = center.name;
let guard = 0;
while (usedAdminNames.has(candidate) && guard < adminNamePrefixes.length) {
candidate = `${adminNamePrefixes[(guard + Math.floor(center.x / 12) + Math.floor(center.y / 12)) % adminNamePrefixes.length]}${center.name}`;
guard++;
const generated = String(center.generatedMunicipalityName || "");
if (usedAdminNames.has(candidate) && Array.from(generated).length >= 2 && !usedAdminNames.has(generated)) {
candidate = generated;
}
center.name = candidate;
usedAdminNames.add(center.name);
}
nameDebug.maxDerivedPerBase = Math.max(0, ...baseVariantCounts.values());
const entitiesForNames = [
...modernCities,
@ -220,6 +253,7 @@ export function finishMapOutput({
prefectureBorder,
prefectureRegionId,
regionalDebug,
terrainDebug,
regionalPrefectureBorders,
elevation,
moisture,
@ -291,6 +325,7 @@ export function finishMapOutput({
tributaryRivers,
smallStreams,
externalGateways,
transportDebug,
entitiesForNames,
nameDebug,
}, options);