export enum ComponentType { POSITION = "POSITION", RENDERABLE = "RENDERABLE", TRAILING_POSITION = "TRAILING_POSITION", SPRITESHEET = "SPRITESHEET", } export interface Component { name: ComponentType; } export interface PositionComponent extends Component { name: ComponentType.POSITION; x: number; y: number; } export interface TrailingPositionComponent extends Component { name: ComponentType.TRAILING_POSITION; trails: Array<{ x: number; y: number; time: number }>; } export interface RenderableComponent extends Component { name: ComponentType.RENDERABLE; } export interface SpriteSpec { ms_per_frame: number; frames: number; top_x: number; top_y: number; end_x: number; end_y: number; } export interface SpriteSheetComponent extends Component { name: ComponentType.SPRITESHEET; source: string; sheet: HTMLImageElement; current_frame: number; last_update: number; current_state: string; state_to_spritespec: Record; }