feat: add Ref city hover details to public maps

This commit is contained in:
2026-08-13 18:04:11 +00:00
parent 851eb18060
commit a318e7d678
6 changed files with 201 additions and 26 deletions
+7 -1
View File
@@ -1,4 +1,7 @@
import { loadMapDefinitionByName as loadRuntimeMapDefinitionByName } from '@sammo-ts/game-engine/scenario/mapLoader.js';
import {
loadMapDefinitionByName as loadRuntimeMapDefinitionByName,
loadRegionDisplayMapByName as loadRuntimeRegionDisplayMapByName,
} from '@sammo-ts/game-engine/scenario/mapLoader.js';
import type { MapDefinition } from '@sammo-ts/logic';
const mapCache = new Map<string, MapDefinition>();
@@ -15,3 +18,6 @@ export const loadMapDefinitionByName = async (mapName: string): Promise<MapDefin
mapCache.set(mapName, map);
return map;
};
export const loadRegionDisplayMapByName = (mapName: string): Promise<Record<number, string>> =>
loadRuntimeRegionDisplayMapByName(mapName);
+20 -5
View File
@@ -1,7 +1,7 @@
import { loadScenarioDefinitionById } from '@sammo-ts/game-engine/scenario/scenarioLoader.js';
import type { ScenarioDefinition } from '@sammo-ts/logic';
import { loadMapDefinitionByName } from './mapDefinition.js';
import { loadMapDefinitionByName, loadRegionDisplayMapByName } from './mapDefinition.js';
export interface MapLayoutCity {
id: number;
@@ -23,10 +23,22 @@ export interface MapLayout {
export interface MapLayoutLoaderOptions {
loadScenario?: (scenarioId: number) => Promise<ScenarioDefinition>;
loadMap?: typeof loadMapDefinitionByName;
loadRegionMap?: typeof loadRegionDisplayMapByName;
}
const layoutCache = new Map<string, MapLayout>();
const CITY_LEVEL_MAP: Record<number, string> = {
1: '수',
2: '진',
3: '관',
4: '이',
5: '소',
6: '중',
7: '대',
8: '특',
};
const parseScenarioId = (scenario: string): number | null => {
const normalized = scenario.replace(/^scenario_/i, '').replace(/\.json$/i, '');
if (!/^\d+$/.test(normalized)) {
@@ -56,13 +68,16 @@ const resolveMapName = async (
export const loadMapLayout = async (scenario: string, options: MapLayoutLoaderOptions = {}): Promise<MapLayout> => {
const mapName = await resolveMapName(scenario, options.loadScenario ?? loadScenarioDefinitionById);
const useCache = !options.loadScenario && !options.loadMap;
const useCache = !options.loadScenario && !options.loadMap && !options.loadRegionMap;
const cached = useCache ? layoutCache.get(mapName) : undefined;
if (cached) {
return cached;
}
const map = await (options.loadMap ?? loadMapDefinitionByName)(mapName);
const [map, regionMap] = await Promise.all([
(options.loadMap ?? loadMapDefinitionByName)(mapName),
(options.loadRegionMap ?? loadRegionDisplayMapByName)(mapName),
]);
const layout: MapLayout = {
mapName,
cityList: map.cities.map((city) => ({
@@ -74,8 +89,8 @@ export const loadMapLayout = async (scenario: string, options: MapLayoutLoaderOp
y: city.position.y,
path: [...city.connections],
})),
regionMap: {},
levelMap: {},
regionMap,
levelMap: CITY_LEVEL_MAP,
};
if (useCache) {