- Added `atmos` property to the `General` interface in `entities.ts`. - Initialized `atmos` to 0 in the `buildGeneralSeeds` function in `bootstrap.ts`. - Updated exports in `index.ts` to include `unitSet.js`. - Introduced new types for crew types and their requirements in `types.ts`. - Implemented `unitSetLoader.ts` for loading unit set definitions from JSON files. - Created `che_징병.ts` action for recruiting crew types with cost and training calculations. - Developed `unitSet.ts` for handling crew type availability and requirements. - Added tests for crew type availability and unit set parsing in `crewType.test.ts`.
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import fs from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
import { parseUnitSetDefinition, type UnitSetDefinition } from '@sammo-ts/logic';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
const DEFAULT_UNIT_SET_ROOT = path.resolve(
|
|
__dirname,
|
|
'..',
|
|
'..',
|
|
'resources',
|
|
'unitset'
|
|
);
|
|
|
|
export interface UnitSetLoaderOptions {
|
|
unitSetRoot?: string;
|
|
filePrefix?: string;
|
|
}
|
|
|
|
const readJsonFile = async (filePath: string): Promise<unknown> => {
|
|
const raw = await fs.readFile(filePath, 'utf8');
|
|
return JSON.parse(raw) as unknown;
|
|
};
|
|
|
|
const resolveUnitSetRoot = (options?: UnitSetLoaderOptions): string =>
|
|
options?.unitSetRoot ?? DEFAULT_UNIT_SET_ROOT;
|
|
|
|
export const resolveUnitSetDefinitionPath = (
|
|
unitSetName: string,
|
|
options?: UnitSetLoaderOptions
|
|
): string => {
|
|
const prefix = options?.filePrefix ?? 'unitset_';
|
|
return path.resolve(resolveUnitSetRoot(options), `${prefix}${unitSetName}.json`);
|
|
};
|
|
|
|
export const loadUnitSetDefinition = async (
|
|
unitSetPath: string
|
|
): Promise<UnitSetDefinition> => {
|
|
const raw = await readJsonFile(unitSetPath);
|
|
return parseUnitSetDefinition(raw);
|
|
};
|
|
|
|
export const loadUnitSetDefinitionByName = async (
|
|
unitSetName: string,
|
|
options?: UnitSetLoaderOptions
|
|
): Promise<UnitSetDefinition> => {
|
|
const unitSetPath = resolveUnitSetDefinitionPath(unitSetName, options);
|
|
return loadUnitSetDefinition(unitSetPath);
|
|
};
|
|
|