<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hna.wiki/Module:Shop?action=history&amp;feed=atom</id>
	<title>Module:Shop - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hna.wiki/Module:Shop?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Shop?action=history"/>
	<updated>2026-07-15T02:34:53Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://hna.wiki/Module:Shop?diff=5921&amp;oldid=prev</id>
		<title>Els236: Imported from ZZZ.</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Shop?diff=5921&amp;oldid=prev"/>
		<updated>2025-11-06T17:56:20Z</updated>

		<summary type="html">&lt;p&gt;Imported from ZZZ.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local lib = require(&amp;#039;Module:Feature&amp;#039;)&lt;br /&gt;
local Item = require(&amp;#039;Module:Item&amp;#039;)._main&lt;br /&gt;
local category = mw.html.create():wikitext(&amp;#039;[[Category:Shops]]&amp;#039;)&lt;br /&gt;
local TS = lib.thousandsSeparator&lt;br /&gt;
local total = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
	if tonumber(frame:callParserFunction(&amp;#039;#var:transclude&amp;#039;, &amp;#039;&amp;#039;) or &amp;#039;0&amp;#039;) == 1 then&lt;br /&gt;
		args.nocat = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local out = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;article-table fandom-table sortable &amp;#039; .. (args.class or &amp;#039;&amp;#039;))&lt;br /&gt;
	local delim = args.delim or &amp;#039;;;&amp;#039;&lt;br /&gt;
	local currency = args.currency or &amp;#039;Denny&amp;#039;&lt;br /&gt;
	local stock = args.stock or &amp;#039;Stock&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Header row&lt;br /&gt;
	local tr = out:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Item&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Cost&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(stock)&lt;br /&gt;
	if tonumber(args.total) == 1 then tr:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;data-sort-type&amp;#039;, &amp;#039;number&amp;#039;):wikitext(&amp;#039;Total Cost&amp;#039;) end&lt;br /&gt;
	if lib.isNotEmpty(args.refresh) then tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Refresh&amp;#039;) end&lt;br /&gt;
	if lib.isNotEmpty(args.note) then tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Notes&amp;#039;) end&lt;br /&gt;
	&lt;br /&gt;
	-- Table body&lt;br /&gt;
	for _, raw in ipairs(args) do&lt;br /&gt;
		local data = p.splitParams(raw, delim)&lt;br /&gt;
		data.size = data.size or args.size or &amp;#039;35&amp;#039; -- first column image size&lt;br /&gt;
		data.currency = currency&lt;br /&gt;
		data.cost_delim = data.cost_delim or args.cost_delim or &amp;#039;,&amp;#039;&lt;br /&gt;
		out:tag(&amp;#039;tr&amp;#039;):node(p.ItemRow(data, args))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Footer row&lt;br /&gt;
	if next(total) ~= nil and tonumber(args.total) == 1 then&lt;br /&gt;
		local tr = out:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Total cost for all items&amp;#039;)&lt;br /&gt;
		local th = tr:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 3 + (lib.isNotEmpty(args.refresh) and 1 or 0) + (lib.isNotEmpty(args.note) and 1 or 0))&lt;br /&gt;
		local discount = false&lt;br /&gt;
		for name, info in lib.spairs(total) do&lt;br /&gt;
			if not discount and info.discounted and info.discounted&amp;gt;0 and info.discounted&amp;lt;info.base then discount=true end&lt;br /&gt;
			th:node(Item{&lt;br /&gt;
				name = name,&lt;br /&gt;
				link = name,&lt;br /&gt;
				count = TS(info.base) .. (info.base2&amp;gt;0 and (&amp;#039; (&amp;#039; .. TS(info.base2) .. &amp;#039;)&amp;#039;) or &amp;#039;&amp;#039;),&lt;br /&gt;
				size = 25&lt;br /&gt;
			}):wikitext(&amp;#039;&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if discount then&lt;br /&gt;
			th:tag(&amp;#039;u&amp;#039;):tag(&amp;#039;small&amp;#039;):wikitext(&amp;#039;Discounted:&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
			for name, info in lib.spairs(total) do&lt;br /&gt;
				th:node(Item{&lt;br /&gt;
					name = name,&lt;br /&gt;
					link = name,&lt;br /&gt;
					count = TS(info.discounted) .. (info.discounted2&amp;gt;0 and (&amp;#039; (&amp;#039; .. TS(info.discounted2) .. &amp;#039;)&amp;#039;) or &amp;#039;&amp;#039;),&lt;br /&gt;
					size = 25&lt;br /&gt;
				}):wikitext(&amp;#039;&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.shop or mw.title.getCurrentTitle().rootText == args.shop then&lt;br /&gt;
		out:node(require(&amp;#039;Module:Namespace detect&amp;#039;).main{main=category})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ItemRow(data, args)&lt;br /&gt;
	local row = mw.html.create()&lt;br /&gt;
	local cost = data[2]&lt;br /&gt;
	local stock = data[3] or data.stock&lt;br /&gt;
	local currency = data.currency or args.currency or &amp;#039;Denny&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	function getCost(i)&lt;br /&gt;
		i.mult = tonumber(i.mult) or 1&lt;br /&gt;
		i.mult2 = tonumber(i.mult2) or 0&lt;br /&gt;
		if not data[1] and lib.isNotEmpty(data.x) and data.x ~= &amp;#039;1&amp;#039; then i.cell:wikitext(&amp;#039;&amp;amp;times;&amp;#039;, data.x, &amp;#039; per &amp;#039;) end&lt;br /&gt;
		if tonumber(i.value) == nil then&lt;br /&gt;
			local items = lib.split(i.value, data.cost_delim or &amp;#039;,&amp;#039;)&lt;br /&gt;
			for a, item in ipairs(items) do&lt;br /&gt;
				local name, amount = string.match(item, &amp;#039;^(.-)%*(.-)$&amp;#039;)&lt;br /&gt;
				amount = tonumber((amount:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)))&lt;br /&gt;
				if name == currency then i.cell:attr(&amp;#039;data-sort-value&amp;#039;, amount) end&lt;br /&gt;
				i.cell:node(Item{&lt;br /&gt;
					name = name,&lt;br /&gt;
					link = name,&lt;br /&gt;
					count = (TS(amount * i.mult) .. (i.mult2 &amp;gt; 0 and (&amp;#039; (&amp;#039; .. TS(amount * i.mult2) .. &amp;#039;)&amp;#039;) or &amp;#039;&amp;#039;)),&lt;br /&gt;
					notext = 1,&lt;br /&gt;
					size = 25&lt;br /&gt;
				}):wikitext(&amp;#039;&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
				if (args.nocat == nil and i.nocat == nil) then category:wikitext(&amp;#039;[[Category:&amp;#039;, name, &amp;#039; Shops]]&amp;#039;) end&lt;br /&gt;
				if i.store_total and not args.nototal then&lt;br /&gt;
					total[name] = total[name] or {base=0, base2=0, discounted=0, discounted2=0}&lt;br /&gt;
					total[name][i.store_total] = total[name][i.store_total] + amount*i.mult&lt;br /&gt;
					total[name][i.store_total..&amp;#039;2&amp;#039;] = total[name][i.store_total..&amp;#039;2&amp;#039;] + amount*i.mult2&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			i.value = tonumber((i.value:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)))&lt;br /&gt;
			i.cell&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, i.value)&lt;br /&gt;
			:node(Item{&lt;br /&gt;
					name = currency,&lt;br /&gt;
					link = currency,&lt;br /&gt;
					count = TS(i.value*i.mult) .. (i.mult2&amp;gt;0 and (&amp;#039; (&amp;#039; .. TS(i.value*i.mult2) .. &amp;#039;)&amp;#039;) or &amp;#039;&amp;#039;),&lt;br /&gt;
					notext = 1,&lt;br /&gt;
					size = 25&lt;br /&gt;
				})&lt;br /&gt;
			if (args.nocat == nil and i.nocat == nil) then category:wikitext(&amp;#039;[[Category:&amp;#039;, currency, &amp;#039; Shops]]&amp;#039;) end&lt;br /&gt;
			if i.store_total and not args.nototal then&lt;br /&gt;
				total[currency] = total[currency] or {base=0, base2=0, discounted=0, discounted2=0}&lt;br /&gt;
				total[currency][i.store_total] = total[currency][i.store_total] + i.value*i.mult&lt;br /&gt;
				total[currency][i.store_total..&amp;#039;2&amp;#039;] = total[currency][i.store_total..&amp;#039;2&amp;#039;] + i.value*i.mult2&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if data[1] then&lt;br /&gt;
		local info = {}&lt;br /&gt;
		local specific = data.specific or lib.ternary(tonumber(data.blueprint)==1, &amp;#039;Blueprint: &amp;#039; .. data[1], data[1])&lt;br /&gt;
		info.name = data[1]&lt;br /&gt;
		info.size = data.size&lt;br /&gt;
		info.count = data.x&lt;br /&gt;
		info.link = data.link or specific&lt;br /&gt;
		info.text = data.text or specific&lt;br /&gt;
		info[&amp;#039;type&amp;#039;] = data[&amp;#039;type&amp;#039;]&lt;br /&gt;
		--if (data[&amp;#039;type&amp;#039;] == &amp;#039;W-Engine&amp;#039;) then&lt;br /&gt;
			--info.suffix = &amp;#039;Icon&amp;#039;&lt;br /&gt;
		--end&lt;br /&gt;
		row:tag(&amp;#039;td&amp;#039;):node(Item(info))&lt;br /&gt;
		if (not args.nocat) then category:wikitext(&amp;#039;[[Category:Sells &amp;#039;, specific, &amp;#039;|&amp;#039;, specific, &amp;#039;]]&amp;#039;) end&lt;br /&gt;
	end&lt;br /&gt;
	if cost then&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		getCost{cell=cell, value=cost}&lt;br /&gt;
		if data.discount then&lt;br /&gt;
			cell:tag(&amp;#039;div&amp;#039;):tag(&amp;#039;u&amp;#039;):tag(&amp;#039;small&amp;#039;):wikitext(&amp;#039;Discounted:&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
			getCost{cell=cell, value=data.discount}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if stock then&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		if stock == &amp;#039;inf&amp;#039; then cell:wikitext(&amp;#039;∞&amp;#039;)&lt;br /&gt;
		else cell:wikitext(stock)&lt;br /&gt;
		end&lt;br /&gt;
		if data.stock2 then cell:wikitext(&amp;#039; (&amp;#039;, data.stock2, &amp;#039;)&amp;#039;) end&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(args.total) == 1 and cost and stock then&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		if stock == &amp;#039;inf&amp;#039; then cell:wikitext(&amp;#039;&amp;amp;mdash;&amp;#039;)&lt;br /&gt;
		else &lt;br /&gt;
			getCost{cell=cell, value=cost, mult=stock, mult2=data.stock2, nocat=true, store_total=&amp;#039;base&amp;#039;}&lt;br /&gt;
			if data.discount then &lt;br /&gt;
				cell:tag(&amp;#039;div&amp;#039;):tag(&amp;#039;u&amp;#039;):tag(&amp;#039;small&amp;#039;):wikitext(&amp;#039;Discounted:&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
				getCost{cell=cell, value=data.discount, mult=stock, mult2=data.stock2, nocat=true, store_total=&amp;#039;discounted&amp;#039;}&lt;br /&gt;
			else&lt;br /&gt;
				-- Sum non-discounted to discount for those who dont have a discounted version&lt;br /&gt;
				local mult = tonumber(stock) or 1&lt;br /&gt;
				local mult2 = tonumber(data.stock2) or 0&lt;br /&gt;
				if cost:find(&amp;#039;%*%d&amp;#039;) then&lt;br /&gt;
					local items = lib.split(cost, data.cost_delim)&lt;br /&gt;
					for a, item in ipairs(items) do&lt;br /&gt;
						local name, amount = string.match(item, &amp;#039;^(.-)*(.-)$&amp;#039;)&lt;br /&gt;
						amount = tonumber((amount:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)))&lt;br /&gt;
						total[name] = total[name] or {base=0, base2=0, discounted=0, discounted2=0}&lt;br /&gt;
						total[name][&amp;#039;discounted&amp;#039;] = total[name][&amp;#039;discounted&amp;#039;] + amount*mult&lt;br /&gt;
						total[name][&amp;#039;discounted2&amp;#039;] = total[name][&amp;#039;discounted2&amp;#039;] + amount*mult2&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					local value = tonumber((cost:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)))&lt;br /&gt;
					total[currency] = total[currency] or {base=0, base2=0, discounted=0, discounted2=0}&lt;br /&gt;
					total[currency][&amp;#039;discounted&amp;#039;] = total[currency][&amp;#039;discounted&amp;#039;] + value*mult&lt;br /&gt;
					total[currency][&amp;#039;discounted2&amp;#039;] = total[currency][&amp;#039;discounted2&amp;#039;] + value*mult2&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if data.refresh or args.refresh then&lt;br /&gt;
		refreshKeys = {d = &amp;#039;Daily&amp;#039;, w = &amp;#039;Weekly&amp;#039;, m = &amp;#039;Monthly&amp;#039;, v = &amp;#039;Per Version&amp;#039;}&lt;br /&gt;
		row:tag(&amp;#039;td&amp;#039;):wikitext(refreshKeys[data.refresh or 1] or data.refresh or &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if data.note or args.note then row:tag(&amp;#039;td&amp;#039;):wikitext(data.note or &amp;#039;&amp;#039;) end&lt;br /&gt;
	&lt;br /&gt;
	return row&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitParams(entry, paramDelim)&lt;br /&gt;
	entry = lib.split(entry, paramDelim)&lt;br /&gt;
	local returns = {}&lt;br /&gt;
	for i, param in ipairs(entry) do&lt;br /&gt;
		local name, val = string.match(param, &amp;#039;^%s*(.-)%s*{?{?=}?}?%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
		if name ~= nil and name ~= &amp;#039;&amp;#039; and val ~= nil then --named params&lt;br /&gt;
			returns[name] = val&lt;br /&gt;
		elseif param ~= nil and param ~= &amp;#039;&amp;#039; then --unnamed params&lt;br /&gt;
			table.insert(returns, param)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return returns&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Els236</name></author>
	</entry>
</feed>