---@meta

--- Core SMODS classes/functions

SMODS = {}

---@type string
--- Current SMODS version
MODDED_VERSION = ""

---@type string
--- Path to SMODS directory
SMODS.path = ""

---@class Mod
---@field id? string Unique ID. 
---@field name? string Name of the mod. 
---@field display_name? string Display name of the mod. 
---@field description? string Mod description. 
---@field priority? number Loaded mods are sorted via priority. 
---@field badge_colour? table HEX color of the mod badge. 
---@field badge_text_colour? table HEX color of the text inside the mod badge. 
---@field prefix? string Unique string. All objects created by this mod have this string appended to their key. 
---@field version? string Mod version. 
---@field dump_loc? true Dumps G.localization table into this mod's directory. 
---@field dependencies? string[] All mods in this array must be installed and loaded for this mod to load. 
---@field conflicts? table[] No mods in this array can be installed for this mod to load. 
---@field provides? table[] If any of the mods in this array are not installed or loaded, this mod will act as a stand in. 
---@field main_file? string Path to the main .lua file of this mod. 
---@field config_file? string Path to the config file of this mod. Defaults to "config.lua" if not provided. 
---@field config? table Config values for this mod. 
---@field can_load? boolean? 
---@field config_tab? fun(): table Creates this mod's config tab UI. 
---@field extra_tabs? fun(): table[] Creates additional tabs within this mod's menu. 
---@field custom_collection_tabs? fun(): table[] Creates additional buttons displayed inside the "Other" tab in collections. 
---@field description_loc_vars? fun(self: Mod|table): table Allows dynamic display of this mod's description. 
---@field custom_ui? fun(mod_nodes: table) Allows manipulating this mod's description tab. 
---@field set_ability_reset_keys? fun(): table When a card's `ability` table is changed, values with a key matching inside this table will not persist. 
---@field reset_game_globals? fun(run_start: boolean) Allows resetting global values every new run or round. 
---@field set_debuff? fun(card: Card|table): boolean|string? Allows controlling when a card is debuffed or not. Return `"prevent_debuff"` to force a card to be undebuffable. 
---@field optional_features? SMODS.optional_features|(fun(): SMODS.optional_features) Table of optional SMODS features to enable inserted into `SMODS.optional_features`. If function, returns table. 
---@field meta_mod? boolean Marked as a "meta mod" by SMODS. Only "Steamodded", "Lovely", and "Balatro" are provided by default.

---@type table<string, Mod|table>
SMODS.Mods = {}

---@type Mod|table?
--- The current mod being loaded. 
SMODS.current_mod = {}

SMODS.Mods["Steamodded"] = SMODS
SMODS.Mods["Lovely"] = {
    id = "Lovely",
    can_load = true,
    meta_mod = true
}
SMODS.Mods["Balatro"] = {
    id = "Balatro",
    can_load = true,
    meta_mod = true
}

---@param modsDirectory string
--- Loads mods. 
function loadMods(modsDirectory) end

--- Initializes Steamodded. 
function initSteamodded() end

--- Injects all classes and items. 
function SMODS.injectItems() end

---@param class SMODS.GameObject|table
--- Inject all SMODS Objects that are part of this class or a subclass.
function SMODS.injectObjects(class) end