bugfix20250107.1

全站通知:

模块:武器

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

此模块的文档可以在模块:武器/doc创建

local p = {}

local stringUtil = require("模块:StringUtil")
local get = require("模块:Get")
local fun = require("模块:Fun")
local acandy = require("模块:ACandy")
local a, some, Raw, Fragment = acandy.a, acandy.some, acandy.Raw, acandy.Fragment
local div, span, li, ul, tr, th, td = a.div, a.span, a.li, a.ul, a.tr, a.th, a.td
local strinova = require("模块:卡拉彼丘")
local qualityColor = strinova.qualityToColor

local skinData = mw.loadData("模块:武器/SkinData")
local otherSkinData = mw.loadData("模块:武器/OtherSkinData")

local skinList = {}
for k, v in pairs(skinData or {}) do
	skinList[k] = v
end
for k, v in pairs(otherSkinData or {}) do
	skinList[k] = v
end

local function nonEmpty(str)
	return str and str ~= ""
end

local function strFallback(str, fallbackStr)
	return str ~= "" and str or fallbackStr
end


p["武器外观"] = function (frame)
	local args = frame.args
	local weaponName =  strinova.get_page_title(args)
	local weaponSkinData = skinList[weaponName]
    if not weaponSkinData then return "未找到武器数据" end
	local skinsByQuality = {
		[8] = {}, [5] = {}, [4] = {}, [3] = {}, [2] = {},
	}
	-- 根据品质分类武器皮肤
	for skinName, skin in pairs(weaponSkinData) do
        local rarity = skin['稀有度']
        local skinsOfThisQuality = skinsByQuality[rarity]
        if skinsOfThisQuality then
            skinsOfThisQuality[#skinsOfThisQuality + 1] = skinName
        end
    end

	local tabLabels, tabBodies = {}, {}
	-- 创建每个品质的标签和内容
	for _, quality in ipairs({ 8, 5, 4, 3, 2 }) do
		local len = #tabLabels
		for i, skinName in ipairs(skinsByQuality[quality]) do
			local borderColor = qualityColor[quality]  -- 获取品质颜色
			tabLabels[len + i] = li { class = "bili-list-style",
				span { class = "tab-panel radius5", style = "width:100%;border:3px solid "..borderColor..";",
					skinName,
				},
			}
			tabBodies[len + i] = div { class = "resp-tab-content",
				"[[文件:", weaponName, "外观-", skinName, ".jpg|x500px|center|link=|class=radius5]]",
			}
		end
	end
	if tabLabels[1] then
		tabLabels[1].class = tabLabels[1].class.." active"  -- 设置第一个标签为激活状态
		tabBodies[1].style = "display:block"  -- 显示第一个内容
	end

	-- 返回武器外观的HTML
	return div { class = "resp-tabs skin-tabs",
		ul { class = "resp-tabs-list clearfix", style = "margin-left:0;margin-top:0",
			tabLabels,
		},
		div { class = "resp-tabs-container", style = "margin-bottom: 5px;",
			tabBodies,
		},
	}
end


p["武器瞄准镜样式"] = function (frame)
	local args = frame.args
	local weaponName =  strinova.get_page_title(args)
	local weaponSkinData = skinData[weaponName]
    if not weaponSkinData then return "未找到武器数据" end
	local skinsByQuality = {
		[0] = {}, [5] = {}, [4] = {}, [3] = {},
	}

	for skinName, skin in pairs(weaponSkinData) do
        local rarity = skin['稀有度']
        local skinsOfThisQuality = skinsByQuality[rarity]
        if skinsOfThisQuality then
            skinsOfThisQuality[#skinsOfThisQuality + 1] = skinName
        end
    end

	local tabLabels, tabBodies = {}, {}

	tabLabels[1] = li { class = "bili-list-style active",
		span { class = "tab-panel radius5", style = "width:100%;border:3px solid "..qualityColor[0]..";",
			"初始",
		},
	}
	tabBodies[1] = div { class = "resp-tab-content", style = "display:block",
		"[[File:瞄准镜样式 "..weaponName..".png|500px|center|link=|class=radius5]]",
	}

	local tabIndex = 2

	for _k, quality in ipairs({ 5, 4, 3 }) do
		for i, skinName in ipairs(skinsByQuality[quality]) do
			local borderColor = qualityColor[quality]
			tabLabels[tabIndex] = li { class = "bili-list-style",
				span { class = "tab-panel radius5", style = "width:100%;border:3px solid "..borderColor..";",
					skinName,
				},
			}
			tabBodies[tabIndex] = div { class = "resp-tab-content",
				"[[File:瞄准镜样式 "..weaponName..skinName..".png|500px|center|link=|class=radius5]]",
			}
			tabIndex = tabIndex + 1
		end
	end

	return div { class = "resp-tabs skin-tabs",
		ul { class = "resp-tabs-list clearfix", style = "margin-left:0;margin-top:0",
			tabLabels,
		},
		div { class = "resp-tabs-container", style = "margin-bottom: 5px;",
			tabBodies,
		},
	}
end


local function flattenSkinData(data)
    local flatData = {}
    for WeaponName, skins in pairs(data) do
        for skinName, skin in pairs(skins) do
            table.insert(flatData, {
                id = skin.id,
                ["武器"] = WeaponName,
                ["外观名称"] = skinName,
                ["稀有度"] = skin["稀有度"],
                ['获得方式'] = skin['获得方式'],
                ["巴布洛晶核"] = skin["巴布洛晶核"] or "",
                ["基弦"] = skin["基弦"] or "",
                ["简介"] = skin["简介"],
                ["备注"] = skin["备注"] or "",
            })
        end
    end
    return flatData
end

local function renderSkinImage(skin)
	local rarityPopupSet = { [3] = true, [4] = true, [5] = true, [8] = true }
    local file = "武器外观图鉴_" .. skin.id .. ".png"
    local weapon = skin['武器']
    local skinName = skin['外观名称']

    if rarityPopupSet[skin['稀有度']] then
        return '<span class="popup"><span style="display: table-cell;"><div style="position:relative;">[[File:'
            .. file .. '|200px|link=]]<br>[[' .. weapon .. ']]:' .. skinName
            .. '</div></span><span style="display:none;">[[file:'
            .. weapon .. '外观-' .. skinName .. '.jpg|400px]]</span></span>'
    end

    return '[[文件:' .. file .. '|200px|link=]]<br>[[' .. weapon .. ']]:' .. skinName
end

local function renderAcquireMethod(ways)
    if type(ways) ~= "table" then return "" end
    local parts = {}
    for _, part in ipairs(ways) do
        if part and part ~= "" then
            parts[#parts + 1] =
                '<span class="badge bg-primary" style="margin: 2px 0; font-size: 13px; white-space: nowrap;">'
                .. part .. '</span>'
        end
    end
    return table.concat(parts, "<br>")
end

----武器外观筛选页
p["武器外观筛选"] = function (frame)
	local flatData = flattenSkinData(skinList)

	local formatter = stringUtil.Formatter [=[
|- class="divsort" data-param1="{武器}" data-param2="{稀有度}" data-param3="{获得方式数据}" data-param4="{巴布洛晶核数据}" data-param5="{基弦数据}"
| {外观}
| {稀有度标签}
| {获得方式}
| {巴布洛晶核}
| {基弦}
| {简介}
| {备注}
]=]

	local result = {}

    for _, skin in ipairs(flatData) do
            local ways = skin["获得方式"] or {}
			local acquire_str = ""
			for i, v in ipairs(ways) do
    			if v and v ~= "" then
        			acquire_str = acquire_str .. (acquire_str ~= "" and "," or "") .. v
    			end
			end

            table.insert(result, formatter({
            	["武器"] = skin["武器"],
                ["稀有度"] = skin["稀有度"],
                ["外观"] = renderSkinImage(skin),
                ["稀有度标签"] = strinova.rarity_tag(frame, skin["稀有度"]),
                ["获得方式数据"] = acquire_str,
                ["巴布洛晶核数据"] = strFallback(skin["巴布洛晶核"], "无"),
                ["基弦数据"] = strFallback(skin["基弦"], "无"),
                ["巴布洛晶核"] = nonEmpty(skin["巴布洛晶核"]) and (skin["巴布洛晶核"] .. "[[文件:图标-小巴布洛晶核.png|15px|link=]]") or "",
                ["基弦"] = nonEmpty(skin["基弦"]) and (skin["基弦"] .. "[[文件:图标-小基弦.png|15px|link=]]") or "",
                ["获得方式"] = renderAcquireMethod(ways),
                ["简介"] = skin["简介"] or "",
                ["备注"] = skin["备注"] or "",
            }))
    end

    return table.concat(result)
end


----意识重构武器外观表
p["意识重构外观筛选"] = function (frame)
	local skinGet = frame.args[1]
	
	local function matchGetWay(ways, needle)
        if not needle or needle == "" then
            return true
        end
        if type(ways) == "table" then
            for _, w in ipairs(ways) do
                if string.find(w, needle, 1, true) then
                    return true
                end
            end
            return false
        end
        return false
	end

	local formatter = stringUtil.Formatter [=[
|-
| {外观}
| {稀有度标签}
| {简介}
]=]

	local result = {}

    for weaponName, skins in pairs(skinList) do
        for skinName, skin in pairs(skins) do
            if matchGetWay(skin['获得方式'], skinGet) then
                table.insert(result, formatter({
                    ['外观'] = renderSkinImage({
                        ['id'] = skin.id,
                        ['武器'] = weaponName,
                        ['外观名称'] = skinName,
                        ['稀有度'] = skin['稀有度']
                    }),
                    ['稀有度标签'] = strinova.rarity_tag(frame, skin["稀有度"]),
                    ['简介'] = skin['简介'] or "",
                }, ''))
            end
        end
    end

    return table.concat(result)
end

return p