Files
OpenFrontIO/src/core/game/TerrainMapFileLoader.ts
T
Tiger McSwane 219d732f84 Added Britannia map with 23 NPC as well as their flags (#186)
Let me know if you have any questions or concerns. This is my first time
near coding, so it would not hurt to double check my work. Thanks!
2025-03-08 16:58:04 -08:00

100 lines
2.6 KiB
TypeScript

import { Cell, GameMapType, TerrainType } from "./Game";
import { consolex } from "../Consolex";
import { NationMap } from "./TerrainMapLoader";
interface MapData {
mapBin: string;
miniMapBin: string;
nationMap: NationMap;
}
interface MapCache {
bin?: string;
miniMapBin?: string;
nationMap?: NationMap;
}
interface BinModule {
default: string;
}
interface NationMapModule {
default: NationMap;
}
// Mapping from GameMap enum values to file names
const MAP_FILE_NAMES: Record<GameMapType, string> = {
[GameMapType.World]: "WorldMap",
[GameMapType.Europe]: "Europe",
[GameMapType.Mena]: "Mena",
[GameMapType.NorthAmerica]: "NorthAmerica",
[GameMapType.Oceania]: "Oceania",
[GameMapType.BlackSea]: "BlackSea",
[GameMapType.Africa]: "Africa",
[GameMapType.Asia]: "Asia",
[GameMapType.Mars]: "Mars",
[GameMapType.SouthAmerica]: "SouthAmerica",
[GameMapType.Britannia]: "Britannia",
};
class GameMapLoader {
private maps: Map<GameMapType, MapCache>;
private loadingPromises: Map<GameMapType, Promise<MapData>>;
constructor() {
this.maps = new Map<GameMapType, MapCache>();
this.loadingPromises = new Map<GameMapType, Promise<MapData>>();
}
public async getMapData(map: GameMapType): Promise<MapData> {
const cachedMap = this.maps.get(map);
if (cachedMap?.bin && cachedMap?.nationMap) {
return cachedMap as MapData;
}
if (!this.loadingPromises.has(map)) {
this.loadingPromises.set(map, this.loadMapData(map));
}
const data = await this.loadingPromises.get(map)!;
this.maps.set(map, data);
return data;
}
private async loadMapData(map: GameMapType): Promise<MapData> {
const fileName = MAP_FILE_NAMES[map];
if (!fileName) {
throw new Error(`No file name mapping found for map: ${map}`);
}
const [binModule, miniBinModule, infoModule] = await Promise.all([
import(
`!!binary-loader!../../../resources/maps/${fileName}.bin`
) as Promise<BinModule>,
import(
`!!binary-loader!../../../resources/maps/${fileName}Mini.bin`
) as Promise<BinModule>,
import(
`../../../resources/maps/${fileName}.json`
) as Promise<NationMapModule>,
]);
return {
mapBin: binModule.default,
miniMapBin: miniBinModule.default,
nationMap: infoModule.default,
};
}
public isMapLoaded(map: GameMapType): boolean {
const mapData = this.maps.get(map);
return !!mapData?.bin && !!mapData?.nationMap;
}
public getLoadedMaps(): GameMapType[] {
return Array.from(this.maps.keys()).filter((map) => this.isMapLoaded(map));
}
}
export const terrainMapFileLoader = new GameMapLoader();