150 lines
5.7 KiB
Lua
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) |