模块:EventShopList

用于显示活动商店的表格,可勾选部分素材计算需要的活动道具总数。

  • 同一代币(token_alias)的本表格在一个页面中只能引用一次,否则将会出错。

现已支持同页面的同一代币(token_alias)多表格处理,但需要遵循以下条件:

  • 在通常情况下,一个页面只需要引用一次,此时不作额外处理(和以前的用法一致)。
  • 如果表格需要引用多次(包括但不限于同一代币),第二次引用开始需添加参数 nofunc,以避免处理函数被多次引用导致功能混乱。

每个表格包含以下参数:

  • |token_alias=(必填)活动道具的名称
  • |token_icon=(可选)活动道具图标的文件名。默认是以token_alias为名的道具图标png文件,默认样式为无框
  • |token_icon_size=(可选)活动道具图标的大小,默认30px
  • |data=(必填)活动商店信息

信息每行一条,根据用途分为不同的书写方式:

可交换道具 
可交换道具 
1;;{{材料消耗|凝胶||30px}} 凝胶;;5;;30;;#95c1ff

其中;;是分隔符。

从左往右的每项分别为:是否初始选中(1/0),兑换项目的名称,库存数量,单价,背景色(可省略,并可使用预设颜色名称【金/紫/蓝/灰/彩/复刻/一星】)。

注意:预设的“灰”不对应T1灰色道具,仅对家具、时装这类无法衡量稀有度但又需要标注的道具使用。对于确实出现了售卖这类道具的情况请改用“一星”。
阶段分隔符 
阶段分隔符 
X;;阶段 00
X;;金色阶段;;linear-gradient(45deg, #F1E944, #F4CF36, #ddbdbd, #EAEBEE 40%)
从左往右的每项分别为:X,分段名称,背景色(可选)。
注释 
注释 
C;;{{mdi|circle-small}}柏喙及其信物也可以通过[[危机合约]]结晶圣所 / 机密圣所兑换获得。
从左往右的每项分别为:C,注释内容。
可折叠分组 
可折叠分组 
因沙洲遗闻的特别商店状态而导入。分组是一个代替阶段分隔符的特殊指令,通常不会使用。

在要分组的位置写入如下分组声明指令:

G/1/S;;STAGE 1;;linear-gradient(45deg, #e5e340, #898751, #383838, #EAEBEE 22%)

从左往右的每项分别为:G指令组,分组标题,背景色(可选)。

G指令组是一个以斜杠(/)分隔的指令组,从左到右为:G,组编号,是否初始显示(有任何值代表不折叠)

当分组声明指令存在时,接下来的所有【可交换道具】与【注释】指令将被划归到该分组,可通过分组的右侧按钮显示和隐藏,避免列表冗长。

要结束分组,请写入分组中止指令:

G/X

注:

  • PRTS的道具图标文件名格式为道具_<道具名>(无框)或道具_带框_<道具名>(带稀有度框),可按需修改。
  • 请勿在阶段分隔符或注释中使用过于复杂的HTML语句,可能会导致渲染出错。
  • 兑换项目图标现使用下列标准:

local p = {}

function p.list(frame)
	local args = (frame == mw.getCurrentFrame() and frame.args) or frame
	
	local list_id = mw.text.trim(args["id"] or "default_list") --表格消歧用id,因逻辑处理变化暂时不用
	local import_func = mw.text.trim(args["nofunc"] or "") == "" and true or false --是否导入处理代码,nofunc存在时则不引入(以适用常规情况下单列表的处理逻辑)
	
	local token_name = mw.text.trim(args["token_alias"] or "")
	local token_icon_file = mw.text.trim(args["token_icon"] or "道具_" .. token_name .. ".png")
	local token_icon_size = mw.text.trim(args["token_icon_size"] or "30px")
	
	local data_str = mw.text.trim(args["data"] or "")
	local nocss = mw.text.trim(args["nocss"] or "")
	
	local token_icon = string.format("[[File:%s|%s|link=]]", token_icon_file, token_icon_size)
	
	local list_func = frame:callParserFunction{name = '#Widget:ShopItemListBase'}
	local selectall_str = frame:callParserFunction{name = '#Widget:ShopItemSelectAll', args = {item = token_name}}
	local checkbox_css = frame:callParserFunction{name = '#Widget:ShopItemListCss'}
	
	res_table = {}
	if nocss=="" and import_func then --不知道为什么要取消导入CSS,不过附加了import_func判断
		table.insert(res_table, checkbox_css .. "\n")
	end
	if import_func then
		table.insert(res_table, list_func .. "\n")
	end
	table.insert(res_table, string.format('{| class="wikitable logo eventshoplist" id="eventshoplist_%s" style="white-space:normal;width:600px;max-width:100%%;display:table;"\n', list_id))
	table.insert(res_table, string.format('!style="width:1.5em;"|%s!!可兑换道具!!style="width:5.0em;"|库存!!style="width:6.0em;"|单价\n', selectall_str))
	
	local data_table = mw.text.split(data_str, "\n", true)
	local colorTable = {
		["金"]="#FFE0B2a3",
		["紫"]="#D1C4E9a3",
		["蓝"]="#BBDEFBa3",
		["灰"]="#E0E0E088",
		["复刻"]="linear-gradient(90deg,#b2f7ffa3,#bfb0f9a3);",
		["彩"]="linear-gradient(90deg,#FFE082a3,#FFCCBCa3,#A5D6A7a3,#FFCC80a3);",
		["一星"]="linear-gradient(90deg, #a0a0a0a3, #a0a0a0a3 4%%, #d0d8e0a3 7%%, #b5d7e9aa, #fdfdfda3)",
	}
	local cur_collapseGroup = nil
	local cur_collapseGroupCollapse = nil
	
	for i = 1, #data_table do
		local datum_table = mw.text.split(data_table[i], ";;", true)
		local name = mw.text.trim(datum_table[2] or "")
		if datum_table[1]:sub(1,1)=='G' then --折叠模式
			groupParam = mw.text.split(datum_table[1], "/", true)
			if groupParam[2] == 'X' then --结束折叠呼号
				cur_collapseGroup = nil
				cur_collapseGroupCollapse = nil
				table.insert(res_table, "|}\n")
			else --执行折叠呼号
				cur_collapseGroup = groupParam[2] --取出ID
				cur_collapseGroupCollapse = (not groupParam[3]) and true or false --是否不折叠(直接显示)
				--换行符 & 折叠表格包裹
				local str = '|-\n|colspan=4 style="padding:0"|\n'
				str = str .. string.format('{| class="wikitable mw-collapsible %s" style="display:table;width:100%%;margin:0;"\n',
					cur_collapseGroupCollapse and "mw-collapsed" or "")
				--标题
				local style_text = ""
				if datum_table[3] or datum_table[4] then
					style_text = "style=\"text-align:center;"
					if datum_table[3] then style_text = style_text.."background:"..datum_table[3]..";" end
					if datum_table[4] then style_text = style_text.."color:"..datum_table[4]..";" end
					style_text = style_text .."\""
				end
				str = str .. string.format("|colspan=4 %s|'''%s'''\n", style_text, name)
				str = str .. string.format("|-style=\"visibility: collapse\"\n")
				str = str .. string.format("|style=\"width:1.5em\"|\n")
				str = str .. string.format("|\n")
				str = str .. string.format("|style=\"width:5.0em\"|\n")
				str = str .. string.format("|style=\"width:6.0em\"|\n")
				table.insert(res_table, str)
			end
		elseif datum_table[1]=='X' then --普通标题
			table.insert(res_table, '|-\n')
			if datum_table[3] or datum_table[4] then
				local str = "|style=\"text-align:center; "
				if datum_table[3] then str = str.."background:"..datum_table[3].."; " end
				if datum_table[4] then str = str.."color:"..datum_table[4]..";" end
				str = str..string.format("\" colspan=4|'''%s'''\n", name)
				table.insert(res_table, str)
			else
				table.insert(res_table, string.format("!colspan=4|%s\n", name))
			end
		elseif datum_table[1]=='C' then --注释
			table.insert(res_table, '|-\n')
			local str = "|__style__ __curColl__ colspan=4|%s\n"
			if datum_table[3] or datum_table[4] then
				local sstr = ""
				if datum_table[3] then sstr = sstr.."background:"..datum_table[3].."; " end
				if datum_table[4] then sstr = sstr.."color:"..datum_table[4]..";" end
				str = str:gsub("__style__", sstr)
			else
				str = str:gsub("__style__", "")
			end
			str = string.format(str, name)
			table.insert(res_table, str)
		else --商品
			local color = mw.text.trim(datum_table[5] or "")
			local textColor = mw.text.trim(datum_table[6] or "")
			local checkbox_str = ""
			
			local num_limit = tonumber(mw.text.trim(datum_table[3] or ""))
			local unit_price = tonumber(mw.text.trim(datum_table[4] or ""))
			if num_limit ~= nil and unit_price ~= nil then
				checkbox_str = frame:expandTemplate{title = "商店列表复选框", args = { token_name, num_limit * unit_price, ((datum_table[1] == '1') and "是" or "否")}}
			end
			
			local num_limit_str = (num_limit ~= nil) and num_limit or mw.text.trim(datum_table[3] or "——")
			local unit_price_str = (unit_price ~= nil) and tostring(unit_price) or mw.text.trim(datum_table[4] or "——")
			
			--换行
			local str = '|-__style__ __curColl__\n'
			if color~="" or textColor~="" then
				str = str:gsub("__style__", string.format("style=\"background:%s;color:%s\"", colorTable[color] or color, textColor) )
			else
				str = str:gsub("__style__ ", "")
			end
			table.insert(res_table, str)
			--table.insert(res_table, (color ~= "") and (string.format('|-style="background:%s"\n', color)) or ('|-\n'))
			table.insert(res_table, string.format("|%s||%s||%s||%s%s\n", checkbox_str, name, num_limit_str, token_icon, unit_price_str))	
		end
	end
	
	--local total_str = frame:callParserFunction{name = '#Widget:ShopItemTotalCost', args = {item = token_name}}
	local total_str = "<span class=\"cnt-event-shop-total\"></span>"
	table.insert(res_table, '|-\n')
	table.insert(res_table, string.format('|colspan="2"|\'\'\'勾选项目总价\'\'\'\n'))
	table.insert(res_table, string.format('|colspan="2"|<div style="display:flex;align-items:center;justify-content:space-between;">%s\'\'\'%s\'\'\'</div>\n', token_icon, total_str))
	table.insert(res_table, '|}')
	
	return table.concat(res_table)
end

return p