import { rect_containsPoint, rect_detectCollision, rect_getDiff, rect_getNearestCorner, rect_getSegmentIntersectionIndices, rect_getSquareDistance, rect_isIntersecting } from './rect';
import { bounce, cross, Response, slide, touch } from './helpers/world/responses';
declare type ResponseType = 'bounce' | 'slide' | 'cross' | 'touch';
declare type Filter = (item: string, other: string) => ResponseType;
interface IItemInfo {
    item: string;
    ti1: number;
    ti2: number;
    weight: number;
}
export interface IRect {
    x: number;
    y: number;
    w: number;
    h: number;
}
export interface ICoords {
    x: number;
    y: number;
}
export interface Collision {
    other: any | null | undefined;
    item: string | null | undefined;
    type?: ResponseType;
    overlaps: boolean;
    ti: number;
    move: ICoords;
    normal: ICoords;
    touch: ICoords;
    itemRect: IRect;
    otherRect: IRect;
    slide?: ICoords;
    bounce?: ICoords;
}
export declare type Cell = {
    ID: string;
    x: number;
    y: number;
    items: Record<string, boolean>;
};
export declare class World {
    responses: Record<ResponseType, Response>;
    cellSize: number;
    rows: Cell[][];
    rects: Map<string, IRect>;
    nonEmptyCells: Record<string, boolean>;
    constructor(input: {
        cellSize: number;
        rects: {};
        rows: [];
        nonEmptyCells: {};
        responses: Record<ResponseType, Response>;
    });
    addResponse(name: ResponseType, response: Response): void;
    getResponseByName(name: ResponseType): Response;
    project(itemID: string | null, rect: IRect, goalX?: number, goalY?: number, filter?: (item: string, other: string) => ResponseType | false): Collision[];
    countCells(): number;
    hasItem(item: string): boolean;
    getItems(): IRect[];
    countItems(): number;
    private addItemToCell;
    getRect(itemID: string): IRect;
    private getItemsInCellRect;
    getItemsInCellPoint(x: number, y: number): IItemInfo['item'][];
    private removeItemFromCell;
    toWorld(cx: number, cy: number): [number, number];
    toCell(x: number, y: number): [number, number];
    queryRect(x: number, y: number, w: number, h: number, filter?: (other?: string) => boolean): string[];
    queryPoint(x: number, y: number, filter?: (other?: string) => boolean): string[];
    querySegment(x1: number, y1: number, x2: number, y2: number, filter?: (other?: string) => boolean): string[];
    querySegmentWithCoords(x1: number, y1: number, x2: number, y2: number, filter?: (other?: string) => boolean): {
        item: string;
        ti1: number;
        ti2: number;
        weight: number | null;
        x1: number;
        x2: number;
        y1: number;
        y2: number;
    }[];
    add(itemID: string, x: number, y: number, w: number, h: number): string;
    remove(itemID: string): void;
    update(itemID: string, x2: number, y2: number, w2?: number, h2?: number): void;
    move(itemID: string, goalX: number, goalY: number, filter?: Filter): ReturnType<Response>;
    check(itemID: string, goalX: number, goalY: number, filter?: Filter): ReturnType<Response>;
}
declare const _default: Readonly<{
    newWorld: (cellSize: number) => World;
    rect: {
        getNearestCorner: typeof rect_getNearestCorner;
        getSegmentIntersectionIndices: typeof rect_getSegmentIntersectionIndices;
        getDiff: typeof rect_getDiff;
        containsPoint: typeof rect_containsPoint;
        isIntersecting: typeof rect_isIntersecting;
        getSquareDistance: typeof rect_getSquareDistance;
        detectCollision: typeof rect_detectCollision;
    };
    responses: {
        touch: typeof touch;
        cross: typeof cross;
        slide: typeof slide;
        bounce: typeof bounce;
    };
}>;
export default _default;
