local ____exports = {}
local ____isaac_2Dtypescript_2Ddefinitions = require("isaac-typescript-definitions")
local CollectibleType = ____isaac_2Dtypescript_2Ddefinitions.CollectibleType
local PickupVariant = ____isaac_2Dtypescript_2Ddefinitions.PickupVariant
local PlayerType = ____isaac_2Dtypescript_2Ddefinitions.PlayerType
local ____cachedClasses = require("core.cachedClasses")
local game = ____cachedClasses.game
local ____constants = require("core.constants")
local VectorZero = ____constants.VectorZero
local ____collectibleTag = require("functions.collectibleTag")
local isQuestCollectible = ____collectibleTag.isQuestCollectible
local ____collectibles = require("functions.collectibles")
local preventCollectibleRotation = ____collectibles.preventCollectibleRotation
local setCollectibleEmpty = ____collectibles.setCollectibleEmpty
local ____entitiesSpecific = require("functions.entitiesSpecific")
local spawnPickupWithSeed = ____entitiesSpecific.spawnPickupWithSeed
local ____players = require("functions.players")
local anyPlayerIs = ____players.anyPlayerIs
local ____rng = require("functions.rng")
local getRandomSeed = ____rng.getRandomSeed
local isRNG = ____rng.isRNG
--- Helper function to spawn a collectible.
-- 
-- Use this instead of the `Game.Spawn` method because it handles the cases of Tainted Keeper
-- collectibles costing coins and prevents quest items from being rotated by Tainted Isaac's
-- rotation mechanic.
-- 
-- If you want to spawn an unseeded collectible, you must explicitly pass `undefined` to the
-- `seedOrRNG` parameter.
-- 
-- @param collectibleType The collectible type to spawn.
-- @param positionOrGridIndex The position or grid index to spawn the collectible at.
-- @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
-- `RNG.Next` method will be called. If `undefined` is provided, it will default to
-- a random seed.
-- @param options Optional. Set to true to make the collectible a "There's Options" style
-- collectible. Default is false.
-- @param forceFreeItem Optional. Set to true to disable the logic that gives the item a price for
-- Tainted Keeper. Default is false.
-- @param spawner Optional.
function ____exports.spawnCollectible(self, collectibleType, positionOrGridIndex, seedOrRNG, options, forceFreeItem, spawner)
    if options == nil then
        options = false
    end
    if forceFreeItem == nil then
        forceFreeItem = false
    end
    if seedOrRNG == nil then
        seedOrRNG = getRandomSeed(nil)
    end
    local seed = isRNG(nil, seedOrRNG) and seedOrRNG:Next() or seedOrRNG
    local collectible = spawnPickupWithSeed(
        nil,
        PickupVariant.COLLECTIBLE,
        collectibleType,
        positionOrGridIndex,
        seed,
        VectorZero,
        spawner
    )
    if isQuestCollectible(nil, collectible) then
        preventCollectibleRotation(nil, collectible)
    end
    if options then
        collectible.OptionsPickupIndex = 1
    end
    if anyPlayerIs(nil, PlayerType.KEEPER_B) and not isQuestCollectible(nil, collectibleType) and not forceFreeItem then
        collectible.ShopItemId = -1
        collectible.Price = 15
    end
    return collectible
end
--- Helper function to spawn a collectible from a specific item pool.
-- 
-- Use this instead of the `Game.Spawn` method because it handles the cases of Tainted Keeper
-- collectibles costing coins and prevents quest items from being rotated by Tainted Isaac's
-- rotation mechanic.
-- 
-- If you want to spawn an unseeded collectible, you must explicitly pass `undefined` to the
-- `seedOrRNG` parameter.
-- 
-- In order to use this function, you must upgrade your mod with `ISCFeature.SPAWN_COLLECTIBLE`.
-- 
-- @param itemPoolType The item pool to draw the collectible type from.
-- @param positionOrGridIndex The position or grid index to spawn the collectible at.
-- @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
-- `RNG.Next` method will be called. If `undefined` is provided, it will default to
-- a random seed.
-- @param options Optional. Set to true to make the collectible a "There's Options" style
-- collectible. Default is false.
-- @param forceFreeItem Optional. Set to true to disable the logic that gives the item a price for
-- Tainted Keeper. Default is false.
-- @param spawner Optional.
function ____exports.spawnCollectibleFromPool(self, itemPoolType, positionOrGridIndex, seedOrRNG, options, forceFreeItem, spawner)
    if options == nil then
        options = false
    end
    if forceFreeItem == nil then
        forceFreeItem = false
    end
    local itemPool = game:GetItemPool()
    local collectibleType = itemPool:GetCollectible(itemPoolType)
    return ____exports.spawnCollectible(
        nil,
        collectibleType,
        positionOrGridIndex,
        seedOrRNG,
        options,
        forceFreeItem,
        spawner
    )
end
--- Helper function to spawn an empty collectible. Doing this is tricky since spawning a collectible
-- with `CollectibleType.NULL` will result in spawning a collectible with a random type from the
-- current room's item pool.
-- 
-- Instead, this function arbitrarily spawns a collectible with `CollectibleType.BROKEN_SHOVEL_1`,
-- and then converts it to an empty pedestal afterward. (Broken Shovel is used instead of e.g. Sad
-- Onion because it is a quest collectible and quest collectibles will prevent Damocles from
-- duplicating the pedestal.)
-- 
-- If you want to spawn an unseeded collectible, you must explicitly pass `undefined` to the
-- `seedOrRNG` parameter.
-- 
-- @param positionOrGridIndex The position or grid index to spawn the empty collectible at.
-- @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
-- `RNG.Next` method will be called. If `undefined` is provided, it will default to
-- a random seed.
function ____exports.spawnEmptyCollectible(self, positionOrGridIndex, seedOrRNG)
    local collectible = ____exports.spawnCollectible(
        nil,
        CollectibleType.BROKEN_SHOVEL_1,
        positionOrGridIndex,
        seedOrRNG,
        false,
        true
    )
    setCollectibleEmpty(nil, collectible)
    return collectible
end
return ____exports
