Exact source used by this build. SHA-256: 401f4be9575044150de1377f61bbb684a81831c1f623ef135e2804c75d1089f1.
1 import farmJson from "../../../data/farm/farm.json";
2 import { AREA_MAPS, isMapBlocked } from "../maps";
3 import { SEASONAL_PALETTES } from "../seasons";
4 import { CROPS } from "../crops";
5 import { ITEMS } from "../items";
6 import { validateContent } from "../../validation";
7 import { FarmConfigSchema } from "./schema";
8 import type { ContentDomain } from "../types";
9
10 export * from "./schema";
11 const metadata = FarmConfigSchema.parse(farmJson);
12 export const FARM_CONFIG = FarmConfigSchema.parse({
13 ...metadata,
14 areas: metadata.areas.map((area) => {
15 const map = AREA_MAPS[area.id];
16 if (!map) throw new Error(`Missing Tiled map for ${area.id}`);
17 if (map.width !== area.width || map.height !== area.height) throw new Error(`Map dimensions disagree for ${area.id}`);
18 return { ...area, ...map, seasons: SEASONAL_PALETTES[area.id] };
19 }),
20 });
21 export const AREA_BY_ID = Object.fromEntries(FARM_CONFIG.areas.map((area) => [area.id, area]));
22 export const farmDomain: ContentDomain = {
23 id: "farm", data: FARM_CONFIG,
24 validate() {
25 validateContent(CROPS, ITEMS, FARM_CONFIG);
26 const start = FARM_CONFIG.starterPlayer;
27 if (isMapBlocked(AREA_MAPS[start.areaId]!, start.x, start.y)) throw new Error("Starter player spawn is blocked");
28 for (const map of Object.values(AREA_MAPS)) if (!AREA_BY_ID[map.id]) throw new Error(`Missing area metadata for ${map.id}`);
29 },
30 };
31