Files
External-Item-Descriptions/features/eid_grid_descriptions.lua
T
2025-06-11 15:56:59 +02:00

150 lines
5.7 KiB
Lua

--------------- Grid entity description modifiers ---------------
-- Table containing grid entity description handlers
-- Use EID:addGridEntity() or EID:addGridEntityConditional() to add new entries to this table.
-- Keys in this table are integers or type GridEntityType
-- Each value is a list of tables with the keys "condition" and "callback", which act like modifiers
-- and define when a description should be shown and how it should be modified.
EID.GridEntityDescriptions = {
}
--- @deprecated Use EID:addGridEntity() instead
EID.GridEntityWhitelist = setmetatable({}, {
__newindex = function(_, _, _)
EID:WriteErrorMsg("GridEntityWhitelist is deprecated, use EID:addGridEntity() instead.")
end
})
--- Adds a new grid entity description entry.
---@param type GridEntityType
---@param variant integer
---@param name string
---@param description string
---@param language? EID_LanguageCode @Default: "en"
function EID:addGridEntity(type, variant, name, description, language)
variant = variant or 0
language = language or "en"
EID:CreateDescriptionTableIfMissing("custom", language)
EID.descriptions[language].custom["-999." .. type .. "." .. variant] = {
variant,
name,
description
}
-- Add a new grid entity description entry
if variant == -1 then
-- Apply to all variants of the grid entity type
EID:addGridEntityConditional(type,
function(_)
return true
end,
function(descObj)
if descObj.ObjSubType == -1 then
return descObj
else
return EID:getDescriptionObj(-999, type, -1, descObj.Entity, true)
end
end)
else
-- Only apply to the specific variant of the grid entity type
EID:addGridEntityConditional(type,
function(entity)
return entity:GetVariant() == variant
end,
function(descObj) return descObj end)
end
end
--- Adds a conditional description handler for a specific grid entity type.
--- This function allows you to specify a grid entity type, a condition function to determine
--- when the description should be shown, and a callback function to modify the description further.
--- @param type GridEntityType
--- @param conditionalFunction function
--- @param callbackFunction function
function EID:addGridEntityConditional(type, conditionalFunction, callbackFunction)
if not EID.GridEntityDescriptions[type] then
EID.GridEntityDescriptions[type] = {}
end
table.insert(EID.GridEntityDescriptions[type], {
condition = conditionalFunction,
callback = callbackFunction
})
end
--- Checks if the given grid entity has a description available
--- @param entity GridEntity: The grid entity to check for a description.
--- @return boolean: Returns true if a description exists for the entity, false otherwise.
function EID:CheckGridEntityHasDescription(entity)
-- Check if the grid entity has a description
if EID.GridEntityDescriptions[entity:GetType()] then
for _, func in ipairs(EID.GridEntityDescriptions[entity:GetType()]) do
if func.condition and func.condition(entity) then
return true
end
end
end
return false
end
----------------------------------------------------
-- Handle Sacrifice room payout
----------------------------------------------------
local function SacrificeRoomCondition(_)
return Game():GetRoom():GetType() == RoomType.ROOM_SACRIFICE and EID.Config["DisplaySacrificeInfo"]
end
local function SacrificeRoomCallback(descObj)
descObj.ObjSubType = math.min(#EID.descriptions["en"].sacrifice, descObj.Entity.VarData + 1)
-- Get sacrifice name by subtype
descObj.Name = EID:getDescriptionEntry("sacrificeHeader") ..
" (" .. descObj.ObjSubType .. "/" .. #EID.descriptions["en"].sacrifice .. ")"
descObj.Description = EID:getDescriptionEntry("sacrifice", descObj.ObjSubType)[3]
local curCounter = descObj.ObjSubType or 1
if curCounter <= 2 then
--Remove B1 Bomb drop info when not on B1
if Game():GetLevel():GetAbsoluteStage() > 1 then
local splitPoint = string.find(descObj.Description, '#', 1)
descObj.Description = descObj.Description:sub(1,splitPoint-1)
end
end
return descObj
end
EID:addGridEntityConditional(GridEntityType.GRID_SPIKES, SacrificeRoomCondition, SacrificeRoomCallback)
----------------------------------------------------
-- Handle Sanguine bond payout preview
----------------------------------------------------
local function SanguineSpikeCondition(gridEntity)
return EID.isRepentance and gridEntity:GetVariant() >= 100 and
EID.Config["DisplaySanguineInfo"]
end
local function SanguineSpikeCallback(descObj)
descObj = EID:getDescriptionObj(5, 100, 692, descObj.Entity, false)
local desc = EID:trimSanguineDesc(descObj.Entity, descObj)
if desc ~= "" then
descObj.Description = desc
end
return descObj
end
EID:addGridEntityConditional(GridEntityType.GRID_SPIKES, SanguineSpikeCondition, SanguineSpikeCallback)
----------------------------------------------------
-- Define GridEntity Conditional handler
----------------------------------------------------
local function EIDGridConditions(descObj)
-- Only run if the grid entity is valid
if descObj.ObjType ~= -999 or not EID.GridEntityDescriptions[descObj.ObjVariant] or not descObj.Entity then return false end
local callbacks = {}
for _, entry in ipairs(EID.GridEntityDescriptions[descObj.ObjVariant]) do
if entry.condition and entry.condition(descObj.Entity) then
table.insert(callbacks, entry.callback)
end
end
return callbacks
end
EID:addDescriptionModifier("EID Grid Descriptions", EIDGridConditions, nil, 1)