UNPKG

sc4

Version:

A command line utility for automating SimCity 4 modding tasks & modifying savegames

61 lines (60 loc) 2.66 kB
import type { uint32 } from 'sc4/types'; import type { FileType, SavegameFileType, SimGridFileType } from './file-types.js'; import type FileClasses from './file-classes.js'; import type Stream from './stream.js'; import type { ValueOf } from 'type-fest'; import type { kFileTypeArray } from './symbols.js'; import type TractInfo from './tract-info.js'; import type { Network, NetworkBridgeOccupant, NetworkTunnelOccupant, PrebuiltNetwork } from './file-classes.js'; export type DBPFFile = { parse(rs: Stream, ...args: any[]): any; }; export type SavegameRecord = DBPFFile & { mem: uint32; }; export type SavegameObject = SavegameRecord & { tract: TractInfo; }; export type SavegameFileTypeId = ValueOf<typeof SavegameFileType>; export type FileTypeId = (typeof FileType)[keyof typeof FileType]; export type DecodedFileTypeId = (typeof FileType)[keyof typeof FileClasses & keyof typeof FileType]; export type DecodedFileClass = ValueOf<typeof FileClasses>; export type DecodedFile = InstanceType<DecodedFileClass>; type ArraySignature = { [kFileTypeArray]: any; }; export type ArrayFile = InstanceType<Extract<DecodedFileClass, ArraySignature>>; export type SimGridFileTypeId = (typeof SimGridFileType)[keyof typeof SimGridFileType]; type DecodedFileTypeIdToFile<T extends DecodedFileTypeId> = InstanceType<typeof FileClasses[TypeIdToStringKey[T]]>; /** * Returns the decoded file as a *type* - i.e. "Lot", "Exemplar", ... based on * its numerical Type ID. */ export type TypeIdToFile<T> = T extends DecodedFileTypeId ? DecodedFileTypeIdToFile<T> : Uint8Array; type TypeIdToStringKey = { [K in keyof typeof FileClasses & keyof typeof FileType as typeof FileType[K]]: K; }; export type TypeIdToFileConstructor<T extends DecodedFileTypeId> = typeof FileClasses[TypeIdToStringKey[T]]; export type ArrayFileTypeId = ValueOf<{ [K in DecodedFileTypeId]: TypeIdToFileConstructor<K> extends { [kFileTypeArray]: any; } ? K : never; }>; type FileMap = { [K in DecodedFileTypeId]: TypeIdToFile<K>; }; export type FileToFileTypeId<T> = { [K in keyof FileMap]: FileMap[K] extends T ? K : never; }[keyof FileMap]; export type FileTypeName = [keyof typeof FileType]; export type DecodedFileTypeName = [ keyof typeof FileClasses & keyof typeof FileType ]; export type NetworkOccupantType = Network | PrebuiltNetwork | NetworkBridgeOccupant | NetworkTunnelOccupant; /** * Figures out the return type of an Entry's read() and readAsync() functions. * We automatically figure out whether the type is a (1) decoded type and (2) * is an array Type. */ export type ReadResult<T> = T extends ArrayFile ? T[] : T; export {};