sc4
Version:
A command line utility for automating SimCity 4 modding tasks & modifying savegames
61 lines (60 loc) • 2.66 kB
TypeScript
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 {};