bugfix20250107.1

全站通知:

模块:图标

来自卡拉彼丘WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:图标/doc创建

local p = {}

local strinova = require("模块:卡拉彼丘")
local qualityToColor = strinova.qualityToColor
local qualityColor = strinova.qualityNameToColor
local format = string.format

-- ================= 辅助函数 =================

-- 通用函数:处理道具图标样式 HTML 生成
local function icon_style(itemName, itemFile, itemQuality, size, imgSize)
	local html = mw.html.create()
	local borderColor = qualityColor[itemQuality] or qualityToColor[itemQuality] or "#ECECEC"

	local iconHTML = html
		:tag('span'):addClass('items-icon')
		:tag('span')
		:addClass('items-icon-img radius10')
		:css("border-color", borderColor)
		:wikitext(format('[[file:%s|%s|class=radius10|link=]]', itemFile, imgSize))
		:done()
		:tag('span')
		:addClass('items-icon-text')
		:css("font-size", size)
		:wikitext(itemName)
		:done()
		:done()
	return tostring(iconHTML)
end

-- 通用函数:在数据表中查找道具
local function find_item_in_data(data, itemName)
	for _, item in pairs(data) do
		if item.name == itemName then
			return item
		end
	end
	return nil
end

-- 通用处理逻辑:用于处理大部分结构相同的道具
-- dataPath: 数据模块路径
-- prefix: 显示名称的前缀 (例如 "礼物:")
-- filePattern: 文件名格式 (可选,如果数据中没有直接提供 file 字段)
-- idField: ID字段名 (可选,默认为 'id', 用于 filePattern)
local function generic_item_handler(itemName, size, imgSize, dataPath, prefix, filePattern, idField)
	local data = mw.loadData(dataPath)
	local item = find_item_in_data(data, itemName)

	if item then
		local fileName = item.file
		-- 如果指定了文件名格式,则根据 ID 生成文件名
		if filePattern then
			local id = item[idField or 'id']
			fileName = format(filePattern, id)
		end

		return icon_style(prefix..item.name, fileName, item.quality, size, imgSize)
	else
		return "名称错误或无数据"
	end
end

-- ================= 主要逻辑 =================

function p.main(frame)
	local args = frame.args
	local itemType = args["类型"] or ""
	local itemName = args[1] or ""
	local roleName = args["role"]
	local size = args["size"] or "12px"  -- 提供默认值
	local imgSize = args["imgSize"] or "20px"  -- 提供默认值

	local itemFunctions = {
		["时装"] = p["角色时装"],
		["外观"] = p["武器外观"],
		["礼物"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:角色礼物/Data", "礼物:") end,
		["喷漆"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/DecalData", "喷漆:") end,
		["基板"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/IDCardData", "基板:") end,
		["封装"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/FrameData", "封装:") end,
		["勋章"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/BadgeData", "勋章:") end,
		["表情"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:角色表情/Data", "表情:") end,
		["语音"] = p["语音"],
		["动作"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/RoleActionData", "超弦体动作:",
				"超弦体动作图标_%d.png") end,
		["气泡"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/ChatBubblesData", "聊天气泡:", "聊天气泡_%d.png") end,
		["头套"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:玩家装饰/MascotHeadData", "头套:", "头套_%d.png") end,
		["卡牌"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:生化卡牌/Data", "卡牌:", "生化卡牌_%d.png", "cardid") end,
		["互动"] = function (n, s, i) return generic_item_handler(n, s, i, "模块:功能道具/InteractivePropsData", "互动道具:", "互动道具_%d.png") end,
		[""] = function (n, s, i) return generic_item_handler(n, s, i, "模块:功能道具/Data", "") end,  -- 功能道具
	}

	if itemFunctions[itemType] then
		return itemFunctions[itemType](itemName, size, imgSize, roleName)
	else
		return p["其它"](itemName, args["file"], args["quality"], size, imgSize)
	end
end

-- ================= 特殊处理函数 =================

p["角色时装"] = function (itemName, size, imgSize, roleName)
	local data = mw.loadData("模块:角色/SkinData")

	-- 定义内部查找函数
	local function find_skin(rName)
		local roleData = data[rName]
		if roleData and roleData[itemName] then
			local roleSkin = roleData[itemName]
			return icon_style(
				"角色时装:"..itemName,
				"角色时装图鉴_"..roleSkin['id']..".png",
				roleSkin['稀有度'],
				size,
				imgSize
			)
		end
		return nil
	end

	if roleName and roleName ~= "" then
		local result = find_skin(roleName)
		if result then return result end
	else
		for rName, _ in pairs(data) do
			local result = find_skin(rName)
			if result then return result end
		end
	end

	return "时装名称错误或无数据"
end

p["武器外观"] = function (itemName, size, imgSize)
	local skinData = mw.loadData("模块:武器/SkinData")
	local otherSkinData = mw.loadData("模块:武器/OtherSkinData")

	-- 合并数据 (注意:loadData 返回的是只读表,不能直接合并,需在逻辑中处理)
	-- 这里我们简化逻辑,先查 skinData,没找到再查 otherSkinData

	local parts = mw.text.split(itemName, "-")
	if #parts < 2 then return "格式错误 (应为 武器-皮肤)" end

	local weaponName = parts[1]
	local skinName = parts[2]

	local function get_skin_info(database)
		if database[weaponName] and database[weaponName][skinName] then
			return database[weaponName][skinName]
		end
		return nil
	end

	local targetSkin = get_skin_info(skinData) or get_skin_info(otherSkinData)

	if targetSkin then
		return icon_style(
			"武器外观:"..weaponName.."-"..skinName,
			"武器外观图鉴_"..targetSkin['id']..".png",
			targetSkin['稀有度'],
			size,
			imgSize
		)
	else
		return "外观名称错误或无数据"
	end
end

p["语音"] = function (itemName, size, imgSize)
	-- 建议将此表移动到 mw.loadData 外部数据文件中,以便维护
	local idMap = {
		['米雪儿·李'] = 22101001,
		['米雪儿'] = 22101001,
		['信'] = 22108001,
		['心夏'] = 22124001,
		['伊薇特'] = 22131001,
		['芙拉薇娅'] = 22115001,
		['忧雾'] = 22121001,
		['蕾欧娜'] = 22123001,
		['千代'] = 22125001,
		['明'] = 22132001,
		['拉薇'] = 22128001,
		['梅瑞狄斯'] = 22133001,
		['令'] = 22109001,
		['香奈美'] = 22137001,
		['艾卡'] = 22119001,
		['珐格兰丝'] = 22120001,
		['玛拉'] = 22122001,
		['奥黛丽·格罗夫'] = 22105001,
		['奥黛丽'] = 22105001,
		['玛德蕾娜·利里'] = 22107001,
		['玛德蕾娜'] = 22107001,
		['绯莎'] = 22112001,
		['星绘'] = 22146001,
		['白墨'] = 22110001,
		['加拉蒂亚·利里'] = 22205001,
		['加拉蒂亚'] = 22205001,
	}

	local voiceID = idMap[itemName]
	if voiceID then
		local voiceFile = format('道具图标_%d.png', voiceID)
		return icon_style(itemName.."语音", voiceFile, "精致", size, imgSize)
	else
		return "语音角色名称错误"
	end
end

p["其它"] = function (Name, File, Quality, size, imgSize)
	return icon_style(Name, File, Quality, size, imgSize)
end

return p