local ____lualib = require("lualib_bundle")
local __TS__New = ____lualib.__TS__New
local ____exports = {}
local ____isaac_2Dtypescript_2Ddefinitions = require("isaac-typescript-definitions")
local CollectibleType = ____isaac_2Dtypescript_2Ddefinitions.CollectibleType
local Dimension = ____isaac_2Dtypescript_2Ddefinitions.Dimension
local DisplayFlag = ____isaac_2Dtypescript_2Ddefinitions.DisplayFlag
local ItemPoolType = ____isaac_2Dtypescript_2Ddefinitions.ItemPoolType
local PickupVariant = ____isaac_2Dtypescript_2Ddefinitions.PickupVariant
local PlayerType = ____isaac_2Dtypescript_2Ddefinitions.PlayerType
local TrinketSlot = ____isaac_2Dtypescript_2Ddefinitions.TrinketSlot
local ____enums = require("functions.enums")
local getEnumLength = ____enums.getEnumLength
local ____flag = require("functions.flag")
local addFlag = ____flag.addFlag
local ____readOnly = require("functions.readOnly")
local newReadonlyColor = ____readOnly.newReadonlyColor
local newReadonlyKColor = ____readOnly.newReadonlyKColor
local newReadonlyVector = ____readOnly.newReadonlyVector
local ____types = require("functions.types")
local asCollectibleType = ____types.asCollectibleType
local ____utils = require("functions.utils")
local eRange = ____utils.eRange
local ____ReadonlySet = require("types.ReadonlySet")
local ReadonlySet = ____ReadonlySet.ReadonlySet
local ____constantsFirstLast = require("core.constantsFirstLast")
local NUM_NORMAL_PILL_COLORS = ____constantsFirstLast.NUM_NORMAL_PILL_COLORS
--- The combination of the following flags:
-- - `DisplayFlag.VISIBLE` (1 << 0)
-- - `DisplayFlag.SHADOW` (1 << 1)
-- - `DisplayFlag.SHOW_ICON` (1 << 2)
____exports.ALL_DISPLAY_FLAGS = addFlag(nil, DisplayFlag.VISIBLE, DisplayFlag.SHADOW, DisplayFlag.SHOW_ICON)
--- The distance of the laser when Azazel does not have any range up items yet. For more info, see
-- the documentation for the `getAzazelBrimstoneDistance` function.
____exports.AZAZEL_DEFAULT_BRIMSTONE_DISTANCE = 75.125
--- The path to the png file for collectible items during Curse of the Blind, making them appear with
-- a red question mark.
____exports.BLIND_ITEM_PNG_PATH = "gfx/items/collectibles/questionmark.png"
--- Bombs explode when their frame count is equal to this value.
____exports.BOMB_EXPLODE_FRAME = 45
____exports.CHEST_PICKUP_VARIANTS = {
    PickupVariant.CHEST,
    PickupVariant.BOMB_CHEST,
    PickupVariant.SPIKED_CHEST,
    PickupVariant.ETERNAL_CHEST,
    PickupVariant.MIMIC_CHEST,
    PickupVariant.OLD_CHEST,
    PickupVariant.WOODEN_CHEST,
    PickupVariant.MEGA_CHEST,
    PickupVariant.HAUNTED_CHEST,
    PickupVariant.LOCKED_CHEST,
    PickupVariant.RED_CHEST,
    PickupVariant.MOMS_CHEST
}
____exports.CHEST_PICKUP_VARIANTS_SET = __TS__New(ReadonlySet, ____exports.CHEST_PICKUP_VARIANTS)
--- This is the initial value of the `EntityPickup.Wait` field after a collectible is spawned.
____exports.COLLECTIBLE_INITIAL_WAIT = 20
____exports.DEFAULT_ITEM_POOL_TYPE = ItemPoolType.TREASURE
--- This is also the distance that a player spawns from the door that they enter a room from.
____exports.DISTANCE_OF_GRID_TILE = 40
____exports.DOGMA_ROOM_GRID_INDEX = 109
____exports.DOOR_HITBOX_RADIUS = 11
--- When Eggies take fatal damage, they go into NPCState.STATE_SUICIDE and spawn 14 Swarm Spiders
-- while their StateFrame ticks upwards. The 14th spider appears when the StateFrame is at this
-- value.
____exports.EGGY_STATE_FRAME_OF_FINAL_SPIDER = 45
--- A non-existent or completely transparent PNG file for use in clearing sprites. For more
-- information, see the documentation for the `clearSprite` helper function.
____exports.EMPTY_PNG_PATH = "gfx/none.png"
--- The random items that appear when the player has TMTRAINER are generated on the fly as they are
-- encountered by the player. The first TMTRAINER item takes the final possible 32 bit number. The
-- second TMTRAINER item subtracts one from that, and so on.
-- 
-- This is equal to 4294967295.
____exports.FIRST_GLITCHED_COLLECTIBLE_TYPE = asCollectibleType(nil, (1 << 32) - 1)
--- An array containing every flying character. This includes non-main characters such as The Soul.
____exports.FLYING_CHARACTERS = {
    PlayerType.AZAZEL,
    PlayerType.LOST,
    PlayerType.SOUL,
    PlayerType.LOST_B,
    PlayerType.JACOB_2_B,
    PlayerType.SOUL_B
}
--- Game frames are what is returned by the `Game.GetFrameCount` method.
____exports.GAME_FRAMES_PER_SECOND = 30
--- Game frames are what is returned by the `Game.GetFrameCount` method.
____exports.GAME_FRAMES_PER_MINUTE = ____exports.GAME_FRAMES_PER_SECOND * 60
--- An array containing every character that is selectable from the main menu (and has achievements
-- related to completing the various bosses and so on).
____exports.MAIN_CHARACTERS = {
    PlayerType.ISAAC,
    PlayerType.MAGDALENE,
    PlayerType.CAIN,
    PlayerType.JUDAS,
    PlayerType.BLUE_BABY,
    PlayerType.EVE,
    PlayerType.SAMSON,
    PlayerType.AZAZEL,
    PlayerType.LAZARUS,
    PlayerType.EDEN,
    PlayerType.LOST,
    PlayerType.LILITH,
    PlayerType.KEEPER,
    PlayerType.APOLLYON,
    PlayerType.FORGOTTEN,
    PlayerType.BETHANY,
    PlayerType.JACOB,
    PlayerType.ISAAC_B,
    PlayerType.MAGDALENE_B,
    PlayerType.CAIN_B,
    PlayerType.JUDAS_B,
    PlayerType.BLUE_BABY_B,
    PlayerType.EVE_B,
    PlayerType.SAMSON_B,
    PlayerType.AZAZEL_B,
    PlayerType.LAZARUS_B,
    PlayerType.EDEN_B,
    PlayerType.LOST_B,
    PlayerType.LILITH_B,
    PlayerType.KEEPER_B,
    PlayerType.APOLLYON_B,
    PlayerType.FORGOTTEN_B,
    PlayerType.BETHANY_B,
    PlayerType.JACOB_B
}
--- Render frames are what is returned by the `Isaac.GetFrameCount` method.
____exports.RENDER_FRAMES_PER_SECOND = 60
--- Render frames are what is returned by the `Isaac.GetFrameCount` method.
____exports.RENDER_FRAMES_PER_MINUTE = ____exports.RENDER_FRAMES_PER_SECOND * 60
____exports.GRID_INDEX_CENTER_OF_1X1_ROOM = 67
--- The floor is represented by a 13x13 grid. Room indexes start at 0. The first column is
-- represented by grid indexes 0, 13, 26, and so on.
____exports.LEVEL_GRID_COLUMN_HEIGHT = 13
--- The floor is represented by a 13x13 grid. Room indexes start at 0. The first row is represented
-- by grid indexes from 0 to 12. The second row is represented by grid indexes from 13 to 25, and so
-- on.
____exports.LEVEL_GRID_ROW_WIDTH = 13
--- All of the collectibles that grant vision on the map.
-- 
-- Note that:
-- - Spelunker Hat is included. Historically, Spelunker Hat was not considered to be mapping, but it
--   was buffed in Repentance to show rooms two or more away.
-- - Book of Secrets is included, which is an "active mapping" instead of passive.
-- - Luna is included, even though it is not a very powerful mapping item.
-- - Cracked Orb is included, even though it requires the player to be damaged in order for it to be
--   activated.
____exports.MAPPING_COLLECTIBLES = {
    CollectibleType.COMPASS,
    CollectibleType.TREASURE_MAP,
    CollectibleType.SPELUNKER_HAT,
    CollectibleType.CRYSTAL_BALL,
    CollectibleType.BLUE_MAP,
    CollectibleType.BOOK_OF_SECRETS,
    CollectibleType.MIND,
    CollectibleType.SOL,
    CollectibleType.LUNA,
    CollectibleType.CRACKED_ORB
}
--- The floor is represented by a 13x13 grid. Room indexes start at 0. The first row is represented
-- by grid indexes from 0 to 12. The second row is represented by grid indexes from 13 to 25, and so
-- on. The maximum room index possible is 168. (It is not 169 because we start at 0 instead of 1.)
____exports.MAX_LEVEL_GRID_INDEX = 168
--- The game has a limit on the number of currently spawned familiars and will refuse to spawn any
-- more if it reaches the limit. Blue flies and blue spiders have a lower priority and will be
-- deleted to make room for other familiars.
____exports.MAX_NUM_FAMILIARS = 64
--- The game can only handle up to four different players.
____exports.MAX_NUM_INPUTS = 4
--- With Birthright, it is possible for Magdalene to have 18 heart containers.
____exports.MAX_PLAYER_HEART_CONTAINERS = 18
--- As the player continues to move in a direction, they will accelerate. When going from one wall to
-- another in a 2x2 room at 2.0 speed (the maximum that the speed stat can rise to), the amount of
-- units moved per update frame will climb to around 9.797 as they hit the opposite wall. The
-- constant specifies a value of 9.8 to be safe.
____exports.MAX_PLAYER_SPEED_IN_UNITS = 9.8
____exports.MAX_PLAYER_TRINKET_SLOTS = getEnumLength(nil, TrinketSlot)
--- If you set `EntityPlayer.ShotSpeed` lower than this value, it will have no effect.
____exports.MIN_PLAYER_SHOT_SPEED_STAT = 0.6
--- If you set `EntityPlayer.Speed` lower than this value, it will have no effect.
____exports.MIN_PLAYER_SPEED_STAT = 0.1
--- The maximum speed stat that a player can have. Any additional speed beyond this will not take
-- effect.
____exports.MAX_SPEED_STAT = 2
--- This is in the center of the room.
____exports.NEW_FLOOR_STARTING_POSITION_NORMAL_MODE = newReadonlyVector(nil, 320, 280)
--- This is near the top door.
____exports.NEW_FLOOR_STARTING_POSITION_GREED_MODE = newReadonlyVector(nil, 320, 280)
--- This is next to the bottom door. Presumably, the player does not start in the center of the room
-- (like they do when getting to a new stage) so that the controls graphic is more visible.
____exports.NEW_RUN_PLAYER_STARTING_POSITION = newReadonlyVector(nil, 320, 380)
--- Corresponds to the maximum value for `EntityPlayer.SamsonBerserkCharge`.
____exports.MAX_TAINTED_SAMSON_BERSERK_CHARGE = 100000
--- The number of dimensions, not including `Dimension.CURRENT`. (This is derived from the
-- `Dimension` enum.)
____exports.NUM_DIMENSIONS = getEnumLength(nil, Dimension) - 1
--- An array containing every valid `Dimension`, not including `Dimension.CURRENT`. (This is derived
-- from the `NUM_DIMENSIONS` constant.)
____exports.DIMENSIONS = eRange(nil, ____exports.NUM_DIMENSIONS)
--- The pill pool for each run is comprised of one effect for each unique pill color (minus gold and
-- horse pills.)
____exports.NUM_PILL_COLORS_IN_POOL = NUM_NORMAL_PILL_COLORS
____exports.ONE_BY_ONE_ROOM_GRID_SIZE = 135
--- An array representing every valid collectible type quality. Specifically, this is: `[0, 1, 2, 3,
-- 4]`
____exports.QUALITIES = {
    0,
    1,
    2,
    3,
    4
}
____exports.MAX_QUALITY = 4
____exports.SECOND_IN_MILLISECONDS = 1000
____exports.MINUTE_IN_MILLISECONDS = 60 * ____exports.SECOND_IN_MILLISECONDS
--- This is equivalent to the bottom-right screen position when the game is in full screen mode.
____exports.RESOLUTION_FULL_SCREEN = Vector(480, 270)
--- This is equivalent to the bottom-right screen position when the game is in windowed mode in a
-- 1600x900 resolution.
____exports.RESOLUTION_1600_900 = Vector(533, 300)
--- The starting room of the floor is always at the same grid index, which is in the middle of the
-- 13x13 grid.
____exports.STARTING_ROOM_GRID_INDEX = 84
--- After taking damage, `EntityPlayer.SamsonBerserkCharge` is incremented by this amount.
____exports.TAINTED_SAMSON_BERSERK_CHARGE_FROM_TAKING_DAMAGE = 10000
--- For `GridEntityType.TELEPORTER` (23).
____exports.TELEPORTER_ACTIVATION_DISTANCE = ____exports.DISTANCE_OF_GRID_TILE / 2
--- In milliseconds, as reported by the `Isaac.GetTime` method.
____exports.TIME_GAME_OPENED = Isaac.GetTime()
--- This is the number of draw coordinates that each heart spans on the UI in the upper left hand
-- corner.
____exports.UI_HEART_WIDTH = 12
--- Equal to `Vector(1, 1)`.
-- 
-- This is a safe version of the `Vector.One` constant. (Other mods can mutate `Vector.One`, so it
-- is not safe to use.)
____exports.VectorOne = newReadonlyVector(nil, 1, 1)
--- Equal to `Vector(0, 0)`.
-- 
-- This is a safe version of the `Vector.Zero` constant. (Other mods can mutate `Vector.Zero`, so it
-- is not safe to use.)
____exports.VectorZero = newReadonlyVector(nil, 0, 0)
--- Equal to `Color(1, 1, 1)`.
-- 
-- This is a safe version of the `Color.Default` constant. (Other mods can mutate `Color.Default`,
-- so it is not safe to use.)
-- 
-- If you need to mutate this, make a copy first with the `copyColor` helper function.
____exports.ColorDefault = newReadonlyColor(nil, 1, 1, 1)
--- Equal to `KColor(1, 1, 1, 1)`.
-- 
-- If you need to mutate this, make a copy first with the `copyKColor` helper function.
____exports.KColorDefault = newReadonlyKColor(
    nil,
    1,
    1,
    1,
    1
)
return ____exports
