"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SlotUpdateDetection = void 0;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
const entitiesSpecific_1 = require("../../../functions/entitiesSpecific");
const Feature_1 = require("../../private/Feature");
const v = {
    room: {
        initializedSlots: new Set(),
    },
};
class SlotUpdateDetection extends Feature_1.Feature {
    v = v;
    postSlotInit;
    postSlotUpdate;
    constructor(postSlotInit, postSlotUpdate) {
        super();
        this.callbacksUsed = [
            // 1
            [isaac_typescript_definitions_1.ModCallback.POST_UPDATE, this.postUpdate],
        ];
        this.customCallbacksUsed = [
            // This has to be the reordered callback because we don't want the `POST_SLOT_INIT` callback
            // firing on the first room of a floor before the `POST_NEW_LEVEL` callback.
            [ModCallbackCustom_1.ModCallbackCustom.POST_NEW_ROOM_REORDERED, this.postNewRoomReordered],
        ];
        this.postSlotInit = postSlotInit;
        this.postSlotUpdate = postSlotUpdate;
    }
    // ModCallback.POST_UPDATE (1)
    postUpdate = () => {
        for (const slot of (0, entitiesSpecific_1.getSlots)()) {
            this.checkNewEntity(slot);
            this.postSlotUpdate.fire(slot);
        }
    };
    // ModCallbackCustom.POST_NEW_ROOM_REORDERED
    postNewRoomReordered = () => {
        for (const slot of (0, entitiesSpecific_1.getSlots)()) {
            this.checkNewEntity(slot);
        }
    };
    checkNewEntity(slot) {
        const ptrHash = GetPtrHash(slot);
        if (!v.room.initializedSlots.has(ptrHash)) {
            v.room.initializedSlots.add(ptrHash);
            this.postSlotInit.fire(slot);
        }
    }
}
exports.SlotUpdateDetection = SlotUpdateDetection;
