refactor: enforce package boundaries

This commit is contained in:
2026-08-07 10:13:29 +00:00
parent b1de142440
commit 1a1d0b2d91
64 changed files with 812 additions and 628 deletions
-96
View File
@@ -1,96 +0,0 @@
import type { City, MapDefinition } from '@sammo-ts/logic';
const buildConnectionMap = (map: MapDefinition): Map<number, number[]> => {
const result = new Map<number, number[]>();
for (const city of map.cities) {
result.set(city.id, city.connections ?? []);
}
return result;
};
export const searchAllDistanceByCityList = (
map: MapDefinition,
cityIds: number[]
): Record<number, Record<number, number>> => {
if (cityIds.length === 0) {
return {};
}
const connectionMap = buildConnectionMap(map);
const citySet = new Set(cityIds);
const result: Record<number, Record<number, number>> = {};
for (const startId of citySet) {
const distances: Record<number, number> = { [startId]: 0 };
const queue: Array<[number, number]> = [[startId, 0]];
while (queue.length > 0) {
const [currentId, dist] = queue.shift()!;
const connections = connectionMap.get(currentId) ?? [];
for (const nextId of connections) {
if (!citySet.has(nextId)) {
continue;
}
if (distances[nextId] !== undefined) {
continue;
}
distances[nextId] = dist + 1;
queue.push([nextId, dist + 1]);
}
}
result[startId] = distances;
}
return result;
};
export const searchAllDistanceByNationList = (
map: MapDefinition,
cities: City[],
nationIds: number[],
suppliedCityOnly: boolean
): Record<number, Record<number, number>> => {
if (nationIds.length === 0) {
return {};
}
const cityIds = cities
.filter((city) => nationIds.includes(city.nationId))
.filter((city) => !suppliedCityOnly || city.supplyState > 0)
.map((city) => city.id);
return searchAllDistanceByCityList(map, cityIds);
};
export const isNeighbor = (
map: MapDefinition,
cities: City[],
nationA: number,
nationB: number,
includeNoSupply = true
): boolean => {
if (nationA === nationB) {
return false;
}
const connectionMap = buildConnectionMap(map);
const nationACities = new Set(
cities
.filter((city) => city.nationId === nationA)
.filter((city) => includeNoSupply || city.supplyState > 0)
.map((city) => city.id)
);
const nationBCities = cities
.filter((city) => city.nationId === nationB)
.filter((city) => includeNoSupply || city.supplyState > 0)
.map((city) => city.id);
for (const cityId of nationBCities) {
const connections = connectionMap.get(cityId) ?? [];
for (const adjId of connections) {
if (nationACities.has(adjId)) {
return true;
}
}
}
return false;
};
@@ -30,7 +30,7 @@ import {
valueFit,
withCanonicalArgumentAliases,
} from '../aiUtils.js';
import { searchAllDistanceByNationList } from '../distance.js';
import { searchAllDistanceByNationList } from '@sammo-ts/logic/world/distance.js';
import { generalActionHandlers } from '../generalAiGeneralActions.js';
import { nationActionHandlers } from '../generalAiNationActions.js';
import { resolveConstraintEnv, type ConstraintEnv } from './constraint.js';
@@ -1,7 +1,7 @@
import type { GeneralAI } from '../core.js';
import { GAME_TICKS_PER_TURN } from '@sammo-ts/common';
import { calcCityDevRatio } from '../../aiUtils.js';
import { searchAllDistanceByCityList } from '../../distance.js';
import { searchAllDistanceByCityList } from '@sammo-ts/logic/world/distance.js';
export const do천도 = (ai: GeneralAI) => {
if (!ai.nation || !ai.nation.capitalCityId) {
@@ -1,6 +1,6 @@
import type { GeneralAI } from '../core.js';
import { asRecord, joinYearMonth, parseYearMonth, readMetaNumber } from '../../aiUtils.js';
import { isNeighbor } from '../../distance.js';
import { isNeighbor } from '@sammo-ts/logic/world/distance.js';
import { resolveNationIncome } from './helpers.js';
const isTechLimited = (ai: GeneralAI, tech: number): boolean => {