interface State {
    actors: Record<string, unknown>;
    bag: Engine.Mino[];
    bagex: Engine.Mino[];
    bagid: number;
    board: Types.Game.BoardSquare[][];
    boardedges: number[][];
    cancelstreak: number;
    cheesespawned: number;
    clutchCount: number;
    countdown_started: number;
    destroyed: boolean;
    diyusi: number;
    endqueued: boolean;
    enemies: number[];
    esc: boolean;
    escAllowed: boolean;
    esciter: number;
    falling: {
        flags: number;
        hy: number;
        irs: number;
        keys: number;
        kick: number;
        locking: number;
        lockresets: number;
        r: number;
        rotresets: number;
        safelock: number;
        skip: unknown[];
        type: Engine.Mino;
        x: number;
        y: number;
    };
    fire: number;
    fireAppr: number;
    fireGrace: number;
    firstInputTime: number;
    g: number;
    gameoverreason: null | GameOverReason;
    garbageacknowledgements: {
        incoming: Record<number, number>;
        outgoing: Record<number, {
            amt: number;
            iid: number;
        }[]>;
    };
    garbageareentries: unknown[];
    garbagearelockeduntil: number;
    garbagebonus: number;
    garbageid: number;
    garbagereceived: number;
    glock: number;
    handling: Handling;
    haschangedcolumn: boolean;
    hesitatedattacks: unknown[];
    hold: Engine.Mino;
    holdlocked: boolean;
    hyperForfeitAllowed: boolean;
    hyperRetryAllowed: boolean;
    impendingdamage: {
        ackiid: null | number;
        active: boolean;
        actor_neg: string;
        actor_pos: string;
        amt: number;
        cid: null | number;
        color: unknown;
        column: undefined | number;
        delay: number;
        gameid: null | number;
        hardened: boolean;
        id: number;
        iid: null | number;
        neg: unknown;
        pos: unknown;
        position: unknown;
        queued: boolean;
        shielded: boolean;
        size: number;
        status: "caution" | "spawn" | "sleeping";
        type: unknown;
        username: null | string;
        x: number;
        y: number;
    }[];
    inputHold: boolean;
    inputRotate180: boolean;
    inputRotateCCW: boolean;
    inputRotateCW: boolean;
    inputSoftdrop: boolean;
    interactionid: number;
    killer: {
        gameid: number;
        type: "sizzle";
        username: null | string;
    };
    lastatktime: number;
    lastcolumn: number;
    lastdoublepiece: unknown;
    lastGenerated: null | number;
    lastoffensive: {
        defense: number;
        offence: number;
        surge: number;
        x: number;
        y: number;
    };
    lastpiecetime: number;
    lastreceivedcount: number;
    lastshift: -1 | 1;
    laststrategychange: number;
    lasttanktime: number;
    lastwasattack: boolean;
    lastwasclear: boolean;
    lShift: {
        arr: number;
        das: number;
        dir: -1;
        held: boolean;
    };
    nextwilltank: boolean;
    notyetreceivedattacks: number;
    otherstates: {
        lastpiece: unknown;
        redo: unknown[];
        undo: unknown[];
    };
    pause: boolean;
    placement: number;
    playing: boolean;
    quadcolumns: number[];
    retry: boolean;
    retryAllowed: boolean;
    retryiter: number;
    rng: number;
    rngex: number;
    rShift: {
        arr: number;
        das: number;
        dir: 1;
        held: boolean;
    };
    setoptions: ReadyOptions;
    spike: {
        count: number;
        count_nomult: number;
        timer: number;
    };
    started: boolean;
    stats: Types.Game.Stats;
    stock: number;
    subframe: number;
    successful: boolean;
    targets: number[];
    time: {
        frameoffset: number;
        locked: boolean;
        prev: number;
        start: number;
        zero: boolean;
    };
    totalRotations: number;
    tutorial: {
        finished: number;
        freeze: number;
        progress: number;
        reqs: number;
        stage: number;
    };
    unsafewaitingframes: unknown[];
    waitingframes: {
        data: any;
        target: number;
        type: string;
    }[];
    windupwaituntil: number;
    zenith: {
        allyincapacitated: boolean;
        blighted: boolean;
        blockrationing: number;
        blockrationing_app: number;
        blockrationing_final: number;
        bonusfromally: number;
        bonusremaining: number;
        climb_pts: number;
        columnsicknessbuckets_i: unknown[];
        columnsicknessbuckets_lj: unknown[];
        columnsicknessbuckets_sz: unknown[];
        escapeartist: number;
        garbageahead: unknown[];
        garbagerowcount: number;
        garbageside: number;
        gracestillmessy: boolean;
        hasseenI5: boolean;
        highestrevive: number;
        incapacitated: boolean;
        isDanger: boolean;
        last_rank_change_was_promote: boolean;
        lastcancel: number;
        lastclearcount: unknown;
        lastclearpiece: unknown;
        lastclearspin: unknown;
        lastclearwasdupe: boolean;
        lastfloorchange: number;
        maxmessy: boolean;
        nogarbagesince: unknown;
        promotion_fatigue: number;
        promptstarttime: number;
        quadbuckets: unknown[];
        rank_locked_until: number;
        revivelevel: number;
        reviveprompts: unknown[];
        spinbuckets: unknown[];
        stalepieces: number;
        staletime: number;
        szsickness: unknown[];
        talentless: boolean;
        top3rowsince: unknown;
        was180Used: boolean;
        wasCCWUsed: boolean;
        wasCWUsed: boolean;
    };
}

Properties

actors: Record<string, unknown>
bag: Engine.Mino[]
bagex: Engine.Mino[]
bagid: number

Note: board is reversed compared to triangle

boardedges: number[][]

0 to 255

cancelstreak: number
cheesespawned: number
clutchCount: number
countdown_started: number
destroyed: boolean
diyusi: number
endqueued: boolean
enemies: number[]
esc: boolean
escAllowed: boolean
esciter: number
falling: {
    flags: number;
    hy: number;
    irs: number;
    keys: number;
    kick: number;
    locking: number;
    lockresets: number;
    r: number;
    rotresets: number;
    safelock: number;
    skip: unknown[];
    type: Engine.Mino;
    x: number;
    y: number;
}
fire: number
fireAppr: number
fireGrace: number
firstInputTime: number
g: number
gameoverreason: null | GameOverReason
garbageacknowledgements: {
    incoming: Record<number, number>;
    outgoing: Record<number, {
        amt: number;
        iid: number;
    }[]>;
}
garbageareentries: unknown[]
garbagearelockeduntil: number
garbagebonus: number
garbageid: number
garbagereceived: number
glock: number
handling: Handling
haschangedcolumn: boolean
hesitatedattacks: unknown[]
hold: Engine.Mino
holdlocked: boolean
hyperForfeitAllowed: boolean
hyperRetryAllowed: boolean
impendingdamage: {
    ackiid: null | number;
    active: boolean;
    actor_neg: string;
    actor_pos: string;
    amt: number;
    cid: null | number;
    color: unknown;
    column: undefined | number;
    delay: number;
    gameid: null | number;
    hardened: boolean;
    id: number;
    iid: null | number;
    neg: unknown;
    pos: unknown;
    position: unknown;
    queued: boolean;
    shielded: boolean;
    size: number;
    status: "caution" | "spawn" | "sleeping";
    type: unknown;
    username: null | string;
    x: number;
    y: number;
}[]
inputHold: boolean
inputRotate180: boolean
inputRotateCCW: boolean
inputRotateCW: boolean
inputSoftdrop: boolean
interactionid: number
killer: {
    gameid: number;
    type: "sizzle";
    username: null | string;
}
lastatktime: number
lastcolumn: number
lastdoublepiece: unknown
lastGenerated: null | number
lastoffensive: {
    defense: number;
    offence: number;
    surge: number;
    x: number;
    y: number;
}
lastpiecetime: number
lastreceivedcount: number
lastshift: -1 | 1
laststrategychange: number
lasttanktime: number
lastwasattack: boolean
lastwasclear: boolean
lShift: {
    arr: number;
    das: number;
    dir: -1;
    held: boolean;
}
nextwilltank: boolean
notyetreceivedattacks: number
otherstates: {
    lastpiece: unknown;
    redo: unknown[];
    undo: unknown[];
}
pause: boolean
placement: number
playing: boolean
quadcolumns: number[]
retry: boolean
retryAllowed: boolean
retryiter: number
rng: number
rngex: number
rShift: {
    arr: number;
    das: number;
    dir: 1;
    held: boolean;
}
setoptions: ReadyOptions
spike: {
    count: number;
    count_nomult: number;
    timer: number;
}
started: boolean
stock: number
subframe: number
successful: boolean
targets: number[]
time: {
    frameoffset: number;
    locked: boolean;
    prev: number;
    start: number;
    zero: boolean;
}
totalRotations: number
tutorial: {
    finished: number;
    freeze: number;
    progress: number;
    reqs: number;
    stage: number;
}
unsafewaitingframes: unknown[]
waitingframes: {
    data: any;
    target: number;
    type: string;
}[]
windupwaituntil: number
zenith: {
    allyincapacitated: boolean;
    blighted: boolean;
    blockrationing: number;
    blockrationing_app: number;
    blockrationing_final: number;
    bonusfromally: number;
    bonusremaining: number;
    climb_pts: number;
    columnsicknessbuckets_i: unknown[];
    columnsicknessbuckets_lj: unknown[];
    columnsicknessbuckets_sz: unknown[];
    escapeartist: number;
    garbageahead: unknown[];
    garbagerowcount: number;
    garbageside: number;
    gracestillmessy: boolean;
    hasseenI5: boolean;
    highestrevive: number;
    incapacitated: boolean;
    isDanger: boolean;
    last_rank_change_was_promote: boolean;
    lastcancel: number;
    lastclearcount: unknown;
    lastclearpiece: unknown;
    lastclearspin: unknown;
    lastclearwasdupe: boolean;
    lastfloorchange: number;
    maxmessy: boolean;
    nogarbagesince: unknown;
    promotion_fatigue: number;
    promptstarttime: number;
    quadbuckets: unknown[];
    rank_locked_until: number;
    revivelevel: number;
    reviveprompts: unknown[];
    spinbuckets: unknown[];
    stalepieces: number;
    staletime: number;
    szsickness: unknown[];
    talentless: boolean;
    top3rowsince: unknown;
    was180Used: boolean;
    wasCCWUsed: boolean;
    wasCWUsed: boolean;
}