function ItemTips.ParseExAddAttr(attr, needAttrList)
if not attr or string.len(attr) == "" then
return
end
local attrAlignment = SL:GetMetaValue("WINPLAYMODE") and tonumber(SL:GetMetaValue("GAME_DATA", "pc_tips_attr_alignment
```lua
function ItemTips.ParseExAddAttr(attr, needAttrList)
-- 函数定义:解析附加属性字符串
if not attr or string.len(attr) == "" then
return
end
-- 如果attr为空或空字符串,直接返回nil
local attrAlignment = SL:GetMetaValue("WINPLAYMODE") and tonumber(SL:GetMetaValue("GAME_DATA", "pc_tips_attr_alignment")) or 0
-- 获取窗口模式,如果为真则获取pc_tips_attr_alignment配置值并转为数字,否则默认为0
local attrCoefficient = SL:GetMetaValue("WINPLAYMODE") and -1 or 1
-- 获取窗口模式,如果为真则系数为-1,否则为1(用于中文字符长度计算)
attrAlignment = math.ceil(attrAlignment / 3)
-- 将对齐值除以3后向上取整
local attList = {}
local exList = {}
-- 初始化属性列表和额外列表(exList在此函数中未使用)
local strList = string.split(attr, ",")
-- 将attr字符串按逗号分割成数组
for i, v in pairs(strList) do
local data = string.split(v, "=")
-- 将每个子串按等号分割
if tonumber(data[1]) and data[2] and tonumber(data[2]) then
table.insert(attList, {id = tonumber(data[1]), value = tonumber(data[2])})
-- 如果分割后的两部分都能转为数字,则插入到attList中,id和value为数字
end
end
if needAttrList then
return attList
end
-- 如果needAttrList参数为真,直接返回attList(原始属性列表)
local stringAtt = GUIFunction:GetAttDataShow(attList, nil, true)
-- 调用GUIFunction:GetAttDataShow将属性列表转换为显示格式的字符串表
local attrShow = {}
for id, v in pairs(stringAtt) do
v.id = id
-- 将id赋值给v.id
local originId = getAttOriginId(id)
-- 调用getAttOriginId函数获取原始属性ID(此函数需在外部定义)
local attConfig = SL:GetMetaValue("ATTR_CONFIG", originId)
-- 从ATTR_CONFIG中获取属性配置
v.sort = attConfig and attConfig.sort or originId + 1000
-- 如果配置存在则取sort字段,否则用originId+1000作为排序值
v.excolor = attConfig.excolor
-- 将配置中的excolor(额外颜色)赋值给v.excolor
table.insert(attrShow, v)
-- 将v插入到attrShow表中
end
table.sort(attrShow, function(a, b)
return a.sort < b.sort
end)
-- 根据sort字段对attrShow进行升序排序
local strList = {}
-- 初始化最终返回的字符串列表(注意这里覆盖了之前的strList变量)
if attrShow and next(attrShow) then
local titleName = ItemTips._showTitleList[3] and ItemTips._showTitleList[3].name or "[附加属性]:"
-- 如果ItemTips._showTitleList[3]存在则取name,否则使用默认标题
local titleColor = ItemTips._showTitleList[3] and ItemTips._showTitleList[3].color or 154
-- 如果ItemTips._showTitleList[3]存在则取color,否则使用默认颜色ID 154
local titleStr = string.format("<font color='%s'>%s</font>", SL:GetHexColorByStyleId(titleColor), titleName)
-- 将颜色ID转换为十六进制颜色值,并格式化为富文本标题字符串
table.insert(strList, {
str = titleStr
})
-- 将标题插入strList
end
for _,v in pairs(attrShow) do
SL:dump(attrShow)
-- 打印attrShow表内容(用于调试)
local name = string.gsub(v.name, " ", "")
-- 移除属性名中的空格
name = string.gsub(name, " ", "")
-- 移除属性名中的全角空格
local value = getAddShow(v.id, v.value) .. v.value
-- 调用getAddShow函数(需外部定义)获取属性值显示前缀,然后拼接原始值
local nameLen, chineseLen = SL:GetUTF8ByteLen(name)
-- 获取属性名的字节长度和中文字符长度
local newLen = math.max(attrAlignment - nameLen - chineseLen * attrCoefficient + SL:GetUTF8ByteLen(value), 0)
-- 计算需要填充的空格长度:对齐值减去名字长度(考虑中文系数)加上值长度,结果最小为0
local lenStr = string.format("%%%ds", newLen)
-- 生成格式字符串,例如"%5s"表示右对齐填充5个空格
value = string.format(lenStr, value)
-- 将值按计算出的长度进行格式化(右对齐填充空格)
local color = tonumber(v.excolor) or 250
-- 取v.excolor如果存在则转为数字,否则使用默认颜色ID 250
local oneStr = string.format("<font color='%s'>%s</font>", SL:GetHexColorByStyleId(color), name .. value)
-- 将颜色ID转换为十六进制颜色值,并格式化为富文本字符串(属性名+格式化后的值)
table.insert(strList, {
id = v.id,
str = oneStr
})
-- 将每个属性字符串插入strList,并保留属性ID
end
return strList
-- 返回最终的富文本字符串列表
end
```
**函数功能总结:**
这个函数用于解析装备的附加属性字符串(格式如"1=100,2=200"),将其转换为按特定格式对齐的富文本显示列表。主要步骤包括:
1. 解析原始字符串为属性ID和值的列表
2. 获取属性配置并排序
3. 计算文本对齐长度(特别处理中文字符)
4. 生成带颜色和格式的富文本字符串
**注意:** 函数中调用了`getAttOriginId`和`getAddShow`这两个外部函数,需要在脚本的其他位置定义。