"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isRoomShapeDoubleCharge = exports.isNarrowRoom = exports.isLRoomShape = exports.isBigRoomShape = exports.is2x1RoomShape = exports.getRoomShapeWidth = exports.getRoomShapeVolume = exports.getRoomShapeTopLeftPosition = exports.getRoomShapeLayoutSize = exports.getRoomShapeCorners = exports.getRoomShapeCharges = exports.getRoomShapeBounds = exports.getRoomShapeBottomRightPosition = exports.getGridIndexDelta = void 0;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const roomShapeBounds_1 = require("../objects/roomShapeBounds");
const roomShapeCorners_1 = require("../objects/roomShapeCorners");
const roomShapeLayoutSizes_1 = require("../objects/roomShapeLayoutSizes");
const roomShapeToBottomRightPosition_1 = require("../objects/roomShapeToBottomRightPosition");
const roomShapeToDoorSlotsToGridIndexDelta_1 = require("../objects/roomShapeToDoorSlotsToGridIndexDelta");
const roomShapeToGridWidth_1 = require("../objects/roomShapeToGridWidth");
const roomShapeToTopLeftPosition_1 = require("../objects/roomShapeToTopLeftPosition");
const roomShapeVolumes_1 = require("../objects/roomShapeVolumes");
const LRoomShapesSet_1 = require("../sets/LRoomShapesSet");
const bigRoomShapesSet_1 = require("../sets/bigRoomShapesSet");
const narrowRoomShapesSet_1 = require("../sets/narrowRoomShapesSet");
/**
 * Helper function to get the grid index delta that a door out of the given room shape would lead
 * to. For example, if you went through the bottom door in a room of `RoomShape.SHAPE_1x2`, you
 * would end up in a room with a grid index that is +26 units from the `SafeGridIndex` of where you
 * started.
 */
function getGridIndexDelta(roomShape, doorSlot) {
    const doorSlotToGridIndexMap = roomShapeToDoorSlotsToGridIndexDelta_1.ROOM_SHAPE_TO_DOOR_SLOTS_TO_GRID_INDEX_DELTA[roomShape];
    return doorSlotToGridIndexMap.get(doorSlot);
}
exports.getGridIndexDelta = getGridIndexDelta;
/**
 * Helper function to see if a given room shape will grant a single charge or a double charge to the
 * player's active item(s).
 *
 * For example, `RoomShape.SHAPE_2x2` will return 2.
 */
function getRoomShapeBottomRightPosition(roomShape) {
    return roomShapeToBottomRightPosition_1.ROOM_SHAPE_TO_BOTTOM_RIGHT_POSITION[roomShape];
}
exports.getRoomShapeBottomRightPosition = getRoomShapeBottomRightPosition;
/**
 * Helper function to get the grid position of the bottom-right tile of a given room shape.
 *
 * "Vector(0, 0)" corresponds to the top left tile of a room, not including the walls. (The top-left
 * wall would be at "Vector(-1, -1)".)
 */
function getRoomShapeBounds(roomShape) {
    return roomShapeBounds_1.ROOM_SHAPE_BOUNDS[roomShape];
}
exports.getRoomShapeBounds = getRoomShapeBounds;
/**
 * Helper function to get the number of charges that a given room shape will grant to a player upon
 * clearing it.
 *
 * For example, `RoomShape.SHAPE_2x2` will return 2.
 */
function getRoomShapeCharges(roomShape) {
    return isRoomShapeDoubleCharge(roomShape) ? 2 : 1;
}
exports.getRoomShapeCharges = getRoomShapeCharges;
/**
 * Helper function to get the corners that exist in the given room shape.
 *
 * Note that these corner locations are not accurate for the Mother Boss Room and the Home closet
 * rooms. (Those rooms have custom shapes.)
 */
function getRoomShapeCorners(roomShape) {
    return roomShapeCorners_1.ROOM_SHAPE_CORNERS[roomShape];
}
exports.getRoomShapeCorners = getRoomShapeCorners;
/**
 * Helper function to get the dimensions of a room shape's layout. This is NOT the size of the
 * room's actual contents! For that, use the `getRoomShapeBounds` function.
 *
 * For example, a horizontal narrow room has a layout size of equal to that of a 1x1 room.
 */
function getRoomShapeLayoutSize(roomShape) {
    return roomShapeLayoutSizes_1.ROOM_SHAPE_LAYOUT_SIZES[roomShape];
}
exports.getRoomShapeLayoutSize = getRoomShapeLayoutSize;
/**
 * Helper function to get the grid position of the top-left tile of a given room shape.
 *
 * "Vector(0, 0)" corresponds to the top left tile of a room, not including the walls. (The top-left
 * wall would be at "Vector(-1, -1)".)
 */
function getRoomShapeTopLeftPosition(roomShape) {
    return roomShapeToTopLeftPosition_1.ROOM_SHAPE_TO_TOP_LEFT_POSITION[roomShape];
}
exports.getRoomShapeTopLeftPosition = getRoomShapeTopLeftPosition;
/**
 * Helper function to get the volume of a room shape, which is the amount of tiles that are inside
 * the room.
 *
 * (This cannot be directly calculated from the bounds since L rooms are a special case.)
 */
function getRoomShapeVolume(roomShape) {
    return roomShapeVolumes_1.ROOM_SHAPE_VOLUMES[roomShape];
}
exports.getRoomShapeVolume = getRoomShapeVolume;
function getRoomShapeWidth(roomShape) {
    return roomShapeToGridWidth_1.ROOM_SHAPE_TO_GRID_WIDTH[roomShape];
}
exports.getRoomShapeWidth = getRoomShapeWidth;
/**
 * Helper function to determine if the provided room is equal to `RoomShape.1x2` (4) or
 * `RoomShape.2x1` (6).
 */
function is2x1RoomShape(roomShape) {
    return roomShape === isaac_typescript_definitions_1.RoomShape.SHAPE_1x2 || roomShape === isaac_typescript_definitions_1.RoomShape.SHAPE_2x1;
}
exports.is2x1RoomShape = is2x1RoomShape;
/**
 * Helper function to detect if the provided room shape is big. Specifically, this is all 1x2 rooms,
 * 2x2 rooms, and L rooms.
 */
function isBigRoomShape(roomShape) {
    return bigRoomShapesSet_1.BIG_ROOM_SHAPES_SET.has(roomShape);
}
exports.isBigRoomShape = isBigRoomShape;
/**
 * Helper function to determine if the provided room is equal to `RoomShape.LTL` (9),
 * `RoomShape.LTR` (10), `RoomShape.LBL` (11), or `RoomShape.LBR` (12).
 */
function isLRoomShape(roomShape) {
    return LRoomShapesSet_1.L_ROOM_SHAPES_SET.has(roomShape);
}
exports.isLRoomShape = isLRoomShape;
/**
 * Helper function to determine if the provided room is equal to `RoomShape.IH` (2), `RoomShape.IV`
 * (3), `RoomShape.IIV` (5), or `RoomShape.IIH` (7).
 */
function isNarrowRoom(roomShape) {
    return narrowRoomShapesSet_1.NARROW_ROOM_SHAPES_SET.has(roomShape);
}
exports.isNarrowRoom = isNarrowRoom;
/**
 * Helper function to see if a given room shape will grant a single charge or a double charge to the
 * player's active item(s).
 *
 * For example, `RoomShape.SHAPE_2x2` will return true.
 */
function isRoomShapeDoubleCharge(roomShape) {
    // 2x2 rooms and L rooms should grant 2 charges.
    return roomShape >= isaac_typescript_definitions_1.RoomShape.SHAPE_2x2;
}
exports.isRoomShapeDoubleCharge = isRoomShapeDoubleCharge;
