import type { GameKey } from "../games/Games";
import type { ImagesetKey } from "../imagesets/Imagesets";
import type { DungeonKeyKey, ItemKey } from "../items";
import type { MonsterKey } from "../monsters/Monsters";
import type { NpcKey } from "../npcs/Npcs";
import type { TilesetKey } from "../tilesets/Tilesets";
import type { Tuple } from "../utils";
import { EventKey } from "../events";
import { GGeometry } from "../geometry";
export type MapKey = "abtesting" | "arena" | "bank" | "bank_b" | "bank_u" | "batcave" | "cave" | "cgallery" | "crypt" | "cyberland" | "d_e" | "d2" | "desertland" | "duelland" | "dungeon0" | "gateway" | "goobrawl" | "halloween" | "hut" | "jail" | "level1" | "level2" | "level2e" | "level2n" | "level2s" | "level2w" | "level3" | "level4" | "main" | "mansion" | "mforest" | "mtunnel" | "old_bank" | "old_main" | "original_main" | "resort" | "resort_e" | "shellsisland" | "ship0" | "spider_instance" | "spookytown" | "tavern" | "test" | "tomb" | "tunnel" | "ucliffs" | "uhills" | "winter_cave" | "winter_cove" | "winter_inn" | "winter_inn_rooms" | "winter_instance" | "winterland" | "woffice";
export type MapZoneKey = "fishing" | "mining";
export interface GMap {
    animatables?: {
        the_door?: {
            position: string;
            x: number;
            y: number;
        };
        the_lever?: {
            position: string;
            x: number;
            y: number;
        };
    };
    burn_multiplier?: number;
    code?: string;
    day?: boolean;
    data: GGeometry;
    doors: Array<[number, number, number, number, MapKey, number] | [number, number, number, number, MapKey, number, number] | [number, number, number, number, MapKey, number, number, "key", DungeonKeyKey] | [number, number, number, number, MapKey, number, number, "ulocked", "complicated"] | [number, number, number, number, MapKey, number, number, "protected" | "ulocked"]>;
    drop_norm?: number;
    event?: EventKey | "pirateship";
    freeze_multiplier?: number;
    fx?: string;
    ignore?: boolean;
    instance?: boolean;
    irregular?: boolean;
    key: string;
    loss?: boolean;
    lux?: number;
    machines?: Array<{
        set: ImagesetKey;
        y: number;
        x: number;
        frames: Array<[number, number, number, number]>;
        subframes?: Array<[number, number, number, number]>;
        type: GameKey;
    }>;
    /**
     * Merchants on the map that sell validates against
     */
    merchants?: Array<{
        /** The map the merchant currently is on */
        map: MapKey;
        /** The unique id of the instance you are in, else a `MapKey` */
        in: MapKey | string;
        x: number;
        y: number;
        id: NpcKey;
    }>;
    monsters?: Array<{
        boundaries?: Array<[MapKey, number, number, number, number]>;
        boundary?: [number, number, number, number];
        count: number;
        gatekeeper?: boolean;
        grow?: boolean;
        polygon?: Array<[number, number]>;
        position?: [number, number];
        rage?: [number, number, number, number];
        random?: boolean;
        roam?: boolean;
        radius?: number;
        stype?: string;
        special?: boolean;
        type: MonsterKey;
    }>;
    mount?: boolean;
    name: string;
    no_bounds?: boolean;
    npcs: Array<{
        position?: [x: number, y: number] | [number, number, number];
        id: NpcKey;
        name?: string;
        boundary?: [number, number, number, number];
        positions?: [[number, number], [number, number, number]];
    }>;
    old_monsters?: Tuple<{
        count: number;
        boundary: [number, number, number, number];
        type: MonsterKey;
    }, 12>;
    on_death?: [MapKey, number];
    on_exit?: [MapKey, number];
    outside?: boolean;
    pvp?: boolean;
    quirks?: Array<[
        number,
        number,
        number,
        number,
        string,
        string
    ] | [number, number, number, number, string]>;
    ref?: {
        c_mid?: [number, number];
        cx?: [number, number, number, number];
        poof?: {
            in: MapKey;
            map: MapKey;
            x: number;
            y: number;
        };
        u_mid?: [number, number];
    };
    safe?: boolean;
    safe_pvp?: boolean;
    small_steps?: boolean;
    /**
     * direction is the way the character spawns 0 down,1 right, 2 bottom ,3 left.
     * size indicates an area you could spawn in with x,y as the center.
     */
    spawns: Array<[x: number, y: number] | [x: number, y: number, direction: number] | [x: number, y: number, direction: number, size: number]>;
    traps?: [
        {
            polygon?: Tuple<[number, number], 60>;
            position?: [number, number];
            type: string;
        }
    ];
    unlist?: boolean;
    /**
     * The position of the upgrade station where you can upgrade
     */
    upgrade?: {
        map: MapKey;
        in: MapKey | string;
        x: number;
        y: number;
        id: NpcKey;
    };
    /**
     * The position of the compound station where you can compound
     */
    compound?: {
        map: MapKey;
        in: MapKey | string;
        x: number;
        y: number;
        id: NpcKey;
    };
    /**
     * Positions where the item is sold.
     */
    items?: Partial<Record<ItemKey, Array<{
        map: MapKey;
        in: MapKey | string;
        x: number;
        y: number;
        id: NpcKey;
    }>>>;
    weather?: string;
    world?: TilesetKey;
    zones?: [
        {
            drop: string;
            polygon: Array<[number, number]>;
            type: MapZoneKey;
        }
    ];
}
