import { BlockType, GroundBlockData, SpriteBlockType } from '../utils/common_types.js'; /** * ``` * +----------+ * | DECODING | * +----------+ * ``` * ``` * 1010|110|1100 (encoded data) * ^^^ (read bits) * ``` * * - shift bits to the right to remove 4 right-most bits * ``` * 1010|110|1100 >> 4 = 1010|110 * ``` * * - build a mask to keep only 3 read bits * ``` * 1<<4 => 1000 * 1<<4 - 1=> 0111 * ``` * * - apply mask to hide 4 left-most bits * ``` * 1010 110 (data) * & 0000 111 (mask) * --------- * 0000 110 (left bits) * ``` */ export interface BlockDataAdapter { decode(rawData: number): BlockData; encode(blockData: BlockData): number; } export declare class IdenticalDataAdapter implements BlockDataAdapter { decode(rawData: number): number; encode(blockData: number): number; } export declare class IdenticalBoolAdapter implements BlockDataAdapter { decode(rawData: number): boolean; encode(blockData: boolean): number; } export declare class GroundDataAdapter { decodeBlockData(rawData: number): GroundBlockData; encodeBlockData(groundData: GroundBlockData): number; } export declare enum BlockDataType { SolidBlock = 0, SpriteBlock = 1 } export type SolidBlockData = { isCheckerBlock?: boolean; blockType: BlockType; }; export type SpriteBlockData = { spriteType: SpriteBlockType; count: number; }; export type ChunkBlockData = { empty: boolean; data?: SolidBlockData | SpriteBlockData; dataType?: BlockDataType; }; export declare class SolidDataAdapter implements BlockDataAdapter { decode(rawData: number): SolidBlockData; encode({ blockType, isCheckerBlock }: SolidBlockData): number; } export declare class SpriteDataAdapter implements BlockDataAdapter { decode(rawData: number): SpriteBlockData; encode({ spriteType, count }: SpriteBlockData): number; } export declare class ChunkDataAdapter implements BlockDataAdapter { spriteDataAdapter: SpriteDataAdapter; solidDataAdapter: SolidDataAdapter; decodeData(rawData: number, dataType: BlockDataType): SolidBlockData | SpriteBlockData; decode(rawData: number): ChunkBlockData; encodeBlock(blockData: number, dataType: BlockDataType): number; encodeSolidBlock(blockType: BlockType, isCheckerBlock?: boolean): number; encodeSpriteBlock(spriteType: SpriteBlockType, count?: number): number; encode({ data, dataType }: ChunkBlockData): number; }