Module:Sandbox/MonkeysHK

local getArgs = require('Module:Arguments').getArgs local loader = require('Module:Loader')

local string, table, yesno, uiText = loader.require('String', 'Table', 'Yesno', 'UIText') local collectionData, armorSets, tooltips = loader.loadData('Collection/Data', 'Armor/Sets', 'Inventory slot/Aliases')

local p = {}

local recipeAliases = { ['r'] = 'recipe', ['recipe'] = 'recipe', ['recipes'] = 'recipes', ['rs'] = 'recipes', ['rec'] = 'recipe', ['recs'] = 'recipes', ['recip'] = 'recipe', ['recips'] = 'recipes', ['res'] = 'recipes', ['re'] = 'recipe', ['up'] = 'upgrade', ['upg'] = 'upgrade', ['u'] = 'upgrade', ['upgr'] = 'upgrade', ['upgra'] = 'upgrade', ['upgrad'] = 'upgrade', ['upgrade'] = 'upgrade', }

-- first row positions for Collection UI local firstRowPositions = { --1 { {3, 5} },	--2 { {3, 4}, {3, 6} },	--3 { {3, 4}, {3, 5}, {3, 6} },	--4 { {3, 3}, {3, 4}, {3, 6}, {3, 7} },	--5 { {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7} },	--6 { {3, 2}, {3, 3}, {3, 4}, {3, 6}, {3, 7}, {3, 8} },	--7 { {3, 2}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8} },	--8 { {3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 6}, {3, 7}, {3, 8}, {3, 9} }, }

-- X/Y positions entries for slot amounts 1-9 in Collection Rewards UI local rewardUIPositions = { -- 1 { {3, 5} },	-- 2 { {3, 4}, {3, 6} },	-- 3 { {3, 3}, {3, 5}, {3, 7} },	-- 4 { {3, 2}, {3, 4}, {3, 6}, {3, 8} },	-- 5 { {2, 2}, {2, 4}, {2, 6}, {2, 8}, {4, 5}, },	-- 6 { {2, 2}, {2, 4}, {2, 6}, {2, 8}, {5, 4}, {5, 6}, },	-- 7 { {2, 2}, {2, 4}, {2, 6}, {2, 8}, {3, 3}, {3, 5}, {3, 7}, },	-- 8 { {2, 2}, {2, 4}, {2, 6}, {2, 8}, {4, 2}, {4, 4}, {4, 6}, {4, 8}, },	-- 9 { {2, 4}, {2, 5}, {2, 6}, {3, 4}, {3, 5}, {3, 6}, {4, 4}, {4, 5}, {4, 6}, },	--10 { {2, 4}, {2, 5}, {2, 6}, {2, 7}, {3, 4}, {3, 5}, {3, 6}, {4, 4}, {4, 5}, {4, 6}, },	--11 { {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {3, 4}, {3, 5}, {3, 6}, {4, 4}, {4, 5}, {4, 6}, }, }

-- maximum of three rows of rewards (or 27 rewards) will be processed local numToEng = { 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty', 'twenty-one', 'twenty-two', 'twenty-three', 'twenty-four', 'twenty-five', 'twenty-six', 'twenty-seven' }

local function makeUI(params) return '' end

- -- Template: Collection UI -- -- Creates a main collection UI for a given item - function p.collectionUI(frame) return p._collectionUI(table.deepCopy(getArgs(frame))) end - -- function: _collectionUI(args: table|frame) -- -- Invoked by. - local function explode(rewards) for _, data in ipairs(rewards) do		for _, rewardTb in ipairs(data.reward) do			-- checks all conditions when reward name needs explosion local tb = {} if armorSets[rewardTb[1]] then for _, w in ipairs(armorSets[rewardTb[1]]) do					local t = table.deepCopy(rewardTb) t[1] = w					table.push(tb, t)				end elseif data.explode then for _, v in ipairs(data.explode) do					local t = table.deepCopy(rewardTb) if type(v) == 'table' then for _, w in ipairs(table.merge(table.namedKeys(v), {1})) do							t[w] = (v[w] ~= '__NIL__' and v[w] or nil) end else t[1] = v					end table.push(tb, t)				end else table.push(tb, rewardTb) end data.reward = tb		end end end local function getRarityCol(item) -- For getting special case rarity colors local function specialCaseColors(item) if item:match('[Mm]inion') then return '9' end -- if item:match('Enchanted Book') then return '9' end if item:match('[Cc]oming [Ss]oon') then return 'c' end if tonumber(item) then return '3' end end local tooltip = tooltips[item] local tooltipRarity = g(tooltip and tooltip.title and tooltip.title:match('^&([a-z0-9])') or nil) return tooltipRarity or specialCaseColors(item) or 'f' end local function typeformatter(item, _type, ttcol) local str if _type:match('[Ee]xperience') then str = ('&8+&3%s %s'):format(item, _type) elseif _type:match('[Uu]pgrade') then str = ('&a%s Upgrade'):format(item) elseif _type:match('[Cc][Oo][Mm][Ii][Nn][Gg] [Ss][Oo][Oo][Nn]') then str = ('&%s%s &8(&4COMING SOON&8)'):format(ttcol, item) elseif _type:match('[Dd]warven [Ff]orge [Rr]ecipe') then str = ('&%s%s &6Dwarven Forge Recipe'):format(ttcol, item) else str = ('&%s%s &7%s'):format(ttcol, item, _type) end return str end local function parseCollectionData(tb, collData, collection) explode(collData) local rows, total, frp = 1, #collData, firstRowPositions[total] local function calcXY(i) local x, y		if frp then local pos = frp[i] x, y = pos[1], pos[2] else local x = 2 + rows local y = i % 9 y = y == 0 and 9 or y		end end for i, rewardTb in ipairs(collData) do		if i > 27 then break end -- Processes upwards of 3 rows of rewards -- calculate X, Y		local x, y = calcXY(i) -- advance row if i % 9 == 0 and i > 0 then rows = rows + 1 end local rewardStr = table.concat(table.map(rewardTb, function(v) return v.tooltip or typeformatter(v.type, v[1], v.ttcolor or getRarityCol(v)) end), '/') local title = ('&%s%s %s'):format(i == 1 and 'e' or 'c', collection, ' ', string._toRoman(i)) local text = ('/&7Progress: &e0&6%%/&f%s &e0&6\/&e%s&7//&7%s:/&#160;&#160;%s//&eClick to view rewards!'):format(			('-'):rep(20),			string._formatShortNum(string._toNumber(v.required)),			#v > 1 and 'Rewards' or 'Reward',			rewardStr		) tb[('%s, %s'):format(x, y)] = ('%s; %s, %s-%s; none, %s, %s'):format(			i == 1 and 'Yellow Stained Glass Pane,' or 'Red Stained Glass Pane,', i,			collection, numToEng[i],			title, text		) end local uis = {} for i, rewardTb in ipairs(collData) do		-- create UIs local _type = rewardTb.reward[1].type if not (_type:match('[Uu]pgrade') or _type:match('[Ee]xperience')) then if _type:match('[Cc]oming [Ss]oon') then else table.push(uis, p._collectionRewardsUI(table.merge(table.map(rewardTb, function(r) return r[1] end)), { -- settings, e.g. return_id, id, etc.				})) end end end end local function parseTextList(s) -- TODO: Restructure text list into a table like Collection/Data local rewards = {} local count = 0 local function g(s) return s and s:gsub('\255', ',') or nil end for i, v in ipairs(string.split((s:gsub('\\,', '\255')), '\n')) do		local _type v = string.methods(v):_trim if v:getValue ~= '' then if v:charAt(1) == '*' then _type = v:charAt(2) == '*' and 'item' or 'amount' end if _type == 'amount' then -- * amount[, goto] local amount, _goto = unpack(string.split(v:sub(2), "%s*,%s*")) count = count + 1 rewards[count] = {} rewards[count].amount = g(amount) rewards[count]._goto = g(_goto and _goto:gsub('^goto%-', '') or nil) elseif _type == 'item' then -- ** reward[, type][, rarity] local item, type, rarity = unpack(string.split(v:sub(3), '%s*,%s*')) item = g(item or v:sub(3)) ttcolor = g((rarity and rarity ~= '') and uiText.getFormatting(rarity) or nil) table.push(rewards[count], {					item, 					ttcolor = ttcolor,					type = (type and type ~= "") and string.ucfirst(recipeAliases[type:lower] or type)				}) end end end return rewards end function p._collectionUI(args) checkType(1, args, { 'table' }) assertTrue(args[1], 'No collection specified', 2) local collection = args[1] and args[1]:gsub('[Ee][Nn][Cc][Hh][Aa]?[Nn]?[Tt]?[Ee]?[Dd]? ?', ):gsub('[Bb][Ll][Oo][Cc][Kk] ?[Oo]?[Ff]? ?', ) local dt = collectionData[collection] if not dt then assertTrue(args[2], 'No collection rewards specified', 2) dt = table.deepCopy(parseTextList(args[2]), true) end local title = mw.title.getCurrentTitle local tb = { collection and collection .. ' Collection' or title.rootText, ['1, 5'] = ('%s, none; none, &e%s Collection, &7View all your %s Collection/&7progress and rewards!//&7Total Collected: &e0'):format(			args.title or collection,			collection,			collection		), id = args['id'], return_text = args['return_text'] or args['goback'], return_link = (args['return_text'] or args['goback']) and (args['return_text'] or args['goback']):gsub('%s*[Cc]ollection', ''), return_id = args['return_id'], hide = args['hide'], }	parseCollectionData(tb, dt, collection) -- pipeline(ui, table.dump, 0, error) return (tostring(ui):gsub('\\(.)', '%1'):gsub('\255', ',')) end

- -- Template: Collection Rewards UI -- -- Creates a collection Rewards UI. - function p.collectionRewardsUI(frame) local args = getArgs(frame) return mw.getCurrentFrame:preprocess(p._collectionRewardsUI(table.deepCopy(args))) end - -- function: _collectionRewardsUI(args) -- -- Invoked by - local function addItem(tb, x, y, item, id, itemTitle, itemText) tb[('%s, %s'):format(x, y)] = ('%s, %s; %s, %s, %s'):format(		item,		id or 'none',		id and 'none' or '',		itemTitle or 'none',		itemText and itemText .. '//&eClick to view recipe!' or 'none'	) end function p._collectionRewardsUI(args) checkType(1, args, { 'table' }) local collection = args[1] and args[1]:gsub('[Ee][Nn][Cc][Hh][Aa]?[Nn]?[Tt]?[Ee]?[Dd]? ?', ):gsub('[Bb][Ll][Oo][Cc][Kk] ?[Oo]?[Ff]? ?', ) local tb = { collection .. ' ' .. string._toRoman(args[2] or 1) .. ' Rewards', id = args['id'], return_text = args['return_text'] or args['goback'], return_link = (args['return_text'] or args['goback']) and (args['return_text'] or args['goback']):gsub('%s*[Cc]ollection', ''), return_id = args['return_id'], hide = args['hide'], }	local items = table.filter(string.split(args[3], '\n'), function(v)		return string.trim(v) ~= ''	end) local amount = #items for i, line in ipairs(items) do		local item, id, title, desc = pipeline(line, string.trim, 2, string.sub, '%s*,%s*', string.unpackedSplit) local tooltip = tooltips[item] local itemTitle = title or (tooltip and tooltip.title) local itemText = desc or (tooltip and tooltip.text) addItem(tb, unpack(rewardUIPositions[amount][i]), item, id, itemTitle, itemText) end return makeUI(tb) end

return p