mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-25 21:54:39 +00:00
5d9b62da4d
## Description: Create mini map option <img width="741" height="234" alt="Screenshot 2025-09-25 at 4 47 47 PM" src="https://github.com/user-attachments/assets/6c442698-8e3b-44d5-b07e-c4f0a916c3bc" /> ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: evan
72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { GameMapType } from "./Game";
|
|
import { GameMapLoader, MapData } from "./GameMapLoader";
|
|
|
|
export class FetchGameMapLoader implements GameMapLoader {
|
|
private maps: Map<GameMapType, MapData>;
|
|
|
|
public constructor(
|
|
private readonly prefix: string,
|
|
private readonly cacheBuster?: string,
|
|
) {
|
|
this.maps = new Map<GameMapType, MapData>();
|
|
}
|
|
|
|
public getMapData(map: GameMapType): MapData {
|
|
const cachedMap = this.maps.get(map);
|
|
if (cachedMap) {
|
|
return cachedMap;
|
|
}
|
|
|
|
const key = Object.keys(GameMapType).find(
|
|
(k) => GameMapType[k as keyof typeof GameMapType] === map,
|
|
);
|
|
const fileName = key?.toLowerCase();
|
|
|
|
if (!fileName) {
|
|
throw new Error(`Unknown map: ${map}`);
|
|
}
|
|
|
|
const mapData = {
|
|
mapBin: () => this.loadBinaryFromUrl(this.url(fileName, "map.bin")),
|
|
map4xBin: () => this.loadBinaryFromUrl(this.url(fileName, "map4x.bin")),
|
|
map16xBin: () => this.loadBinaryFromUrl(this.url(fileName, "map16x.bin")),
|
|
manifest: () => this.loadJsonFromUrl(this.url(fileName, "manifest.json")),
|
|
webpPath: async () => this.url(fileName, "thumbnail.webp"),
|
|
} satisfies MapData;
|
|
|
|
this.maps.set(map, mapData);
|
|
return mapData;
|
|
}
|
|
|
|
private url(map: string, path: string) {
|
|
let url = `${this.prefix}/${map}/${path}`;
|
|
|
|
if (this.cacheBuster) {
|
|
url += `${url.includes("?") ? "&" : "?"}v=${this.cacheBuster}`;
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
private async loadBinaryFromUrl(url: string) {
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to load ${url}: ${response.statusText}`);
|
|
}
|
|
|
|
const data = await response.arrayBuffer();
|
|
return new Uint8Array(data);
|
|
}
|
|
|
|
private async loadJsonFromUrl(url: string) {
|
|
const response = await fetch(url);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to load ${url}: ${response.statusText}`);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
}
|