Module:Building

--[==[-- -- Lua script to get Building Information -- building: get Building data based on input parameters 1 = Building Name 2 = Enchantment Number 3 = Event Name / IP Short Name

Unknown is returned if building is not in data. --]==]

local p = {}

---[=[ For testing remove 1 '-' from start of line local attrData = mw.loadData('Module:Building/data') --[==[]=] local attrData = { -- The Little Mermaid -- ["Under the Sea"] = { ["A"] = "Jamming with a Hot Crustacean Band", ["R"] = { ["magic"] = {"4h", 12, 155, true}, ["tlm"] = {"4h", 23, 32, true}, ["wir"] = {"4h", 12, 50}, }   }, } --]==]

local COLL = require("Module:ItemCollection").getCollection local TOK = require("Module:CharacterToken").getToken local collectionData = mw.loadData( 'Module:ItemCollection/data' ) local EC = require("Module:EC").getEC local icon = require("Module:CharacterAvatar").getAvatar local npc = require("Module:NPC").getNPC local lte = require("Module:LTEvent").getLTE local util = require("Module:Utility")

function p.building(frame) local tArgs = util.getArgs(frame)

local buildName = tArgs[1] or "" local enchLvl = tArgs[2] or "" local event = tArgs[3] or ""

buildName = buildName:gsub("^%s*(.-)%s*$", "%1") or ''

if buildName == "" then buildName = mw.title.getCurrentTitle.text else buildName = mw.text.decode(buildName, false) end enchLvl = enchLvl:upper:gsub("^%s*(.-)%s*$", "%1") or '' event = event:lower:gsub("^%s*(.-)%s*$", "%1") or ''

local outType = "D"

if enchLvl:match("^[ACRD]$") then outType = enchLvl enchLvl = "" end

enchLvl = enchLvl:gsub("[^0-5]", "")

local data = {}

if attrData[buildName] then data = attrData[buildName] else data = { ["A"] = "?", ["R"] = { ["magic"] = {"?h", "?", "?"}, }	   }	    buildName = "Unknown" end

local reward = ""

if event ~= "" and data["R"][event] then reward = event else reward = "magic" -- current event (no magic entry yet) -- pick the first reward key (should be for current event) if not data["R"]["magic"] then for k, v in pairs(data["R"]) do				reward = k				break end end end

local tFunc = { -- Activity ["A"] = function return data["A"] end, -- Collection Time ["C"] = function local retText = "" local space = ""

if event ~= "" then for k, v in pairs(data["R"]) do							if k ~= "magic" then local tRow = { space, v[1], "", "",									" (", lte({k, nil, "K"}), " Event) " }								retText = retText .. table.concat(tRow) space = " " end end if space == "" then retText = data["R"][reward][1] end else retText = data["R"][reward][1] end return retText end, -- Rewards only ["R"] = function local retText = "" local space = ""

if event ~= "" then for k, v in pairs(data["R"]) do							if k ~= "magic" then local tRow = { space, EC({"XP"}), v[2], ", ", EC({k}), v[3], "", "",									" (", lte({k, nil, "K"}), " Event) " }								if v[4] then tRow[7] = ", " tRow[8] = npc({"Gold Trophies", nil, nil, nil, k}) end retText = retText .. table.concat(tRow) space = " " end end if space == "" then if data["R"][reward][1] ~= "" then local tRow = { "", EC({"XP"}), data["R"][reward][2], ", ", EC({reward}), data["R"][reward][3], }								retText = retText .. table.concat(tRow) end end else if data["R"][reward][1] ~= "" then local tRow = { "", EC({"XP"}), data["R"][reward][2], ", ", EC({reward}), data["R"][reward][3], "", "",							}							if data["R"][reward][4] then tRow[7] = ", " tRow[8] = npc({"Gold Trophies", "G"}) end retText = retText .. table.concat(tRow) end end return retText end, -- Default (token rewards table row) ["D"] = function local tRet = {"|-\n| style=\"text-align: center;\"|", "", "\n|", "", "",									"", ": ", "", "", "", "", "\n|\n|", "", "\n| colspan=\"2\" nowrap|", "", "", ", ", "", "", "",									""					}					tRet[ 2] = icon({"Kingdom", event or ""}) tRet[ 6] = buildName tRet[ 8] = data["A"] if data["R"][reward][1] ~= "" then tRet[13] = data["R"][reward][1] tRet[15] = EC({"XP"}) tRet[16] = data["R"][reward][2] tRet[18] = EC({reward}) tRet[19] = data["R"][reward][3] else tRet[17] = "" end if data["R"][reward][4] then tRet[20] = ", " if event then tRet[21] = npc({"Gold Trophies", nil, nil, nil, event}) else tRet[21] = npc({"Gold Trophies", "G"}) end end if enchLvl ~= "" then tRet[ 9] = " ''* Enchantment Level " tRet[10] = tostring(enchLvl) tRet[11] = "'' " end return table.concat(tRet) end, }	return tFunc[outType] end

function p.getTrophies(frame) local tRet = {} local tAtt = {} local tPrem = {} local attractions = {} local reward = "" for item, data in pairs(attrData) do		if not data["R"]["magic"] then for k, v in pairs(data["R"]) do				reward = k				break end else reward = "magic" end if data["R"][reward][4] then local durNumb, durHMS = string.match(data["R"][reward][1], "^([%d%?]+)([hms])$") local durNumb = tonumber(durNumb) if durHMS == "h" then durNumb = durNumb * 3600 elseif durHMS == "m" then durNumb = durNumb * 60 end table.insert(attractions, {durNumb, data, item}) end end table.sort(attractions, function(a,b) return a[1] < b[1] end) for att, item in pairs(attractions) do		if not item[2]["R"]["magic"] then for k, v in pairs(item[2]["R"]) do				reward = k				break end else reward = "magic" end tRet = {"|-\n| style=\"text-align: center;\"|", "", "\n|", "", "",				"", ": ", "", "", "", "", "\n|\n|", "", "\n| colspan=\"2\" nowrap|", "", "", ", ", "", "", "\n" }

tRet[ 2] = icon({"Kingdom"}) tRet[ 6] = item[3] tRet[ 8] = item[2]["A"] tRet[13] = item[2]["R"][reward][1] tRet[15] = EC({"XP"}) tRet[16] = item[2]["R"][reward][2] tRet[18] = EC({reward}) tRet[19] = item[2]["R"][reward][3] local collectionData = mw.loadData( 'Module:ItemCollection/data' ) if collectionData["Items"][item[3]][3] and collectionData["Items"][item[3]][3] == true then table.insert(tPrem, table.concat(tRet)) else table.insert(tAtt, table.concat(tRet)) end end table.insert(tAtt, '|-\n! colspan="5"|Premium\n') table.insert(tAtt, table.concat(tPrem)) return table.concat(tAtt) end

function p.getList(frame) local tArgs = util.getArgs(frame) local buildType = tArgs[1] or "Ba" local buildings = {} local tOut = {	'{| class="article-table sortable" style="width: 100%;"\n', '! rowspan="2" class="unsortable" width="1"|\n', '! rowspan="2" width="57%"|Name\n', '! rowspan="2" style="text-align: center;" width="1"|Premium\n', '! rowspan="2" style="text-align: center;" width="1"|Limited\n', '! colspan="3" style="text-align: center;"|Rewards\n', '! rowspan="2" style="text-align: center;" width="10"|Magic per hour\n', '|-\n! width="10%"|Time\n! width="10%"|XP\n! width="10%"|Magic' }	local tAtt = {} for item, data in pairs(attrData) do   	if item ~= ("\"it's a small world\"" or "Big Thunder Mountain Railroad" or "Expedition Everest") then if collectionData["Items"][item] and collectionData["Items"][item][2] == buildType:lower then if data["A"] and data["R"]["magic"] and data["R"]["magic"][1] ~= "" then table.insert(buildings, {mw.ustring.gsub(mw.ustring.lower(item), "[':\"%,%.]", ""), item, data})      			end       		end       	end	end	table.sort(buildings, function(a,b) return a[1] < b[1] end)    for _, att in pairs(buildings) do		local premium = ""		if collectionData["Items"][att[2]] and collectionData["Items"][att[2]][3] and collectionData["Items"][att[2]][3] == true then			premium = ""       	end		local limited = ""		if collectionData["Items"][att[2]] and collectionData["Items"][att[2]][4] and collectionData["Items"][att[2]][4] == true then			limited = ""   		end		tAtt = {"\n|-\n| style=\"text-align: center;\"|", "",				"\n|", "", ": ", "", "",				"\n| style=\"text-align: center;\"|", premium,				"\n| style=\"text-align: center;\"|", limited,				"\n| nowrap data-sort-value=\"", "", "\"|", "",				"\n| nowrap data-sort-value=\"", "", "\"|", "",				"\n| nowrap data-sort-value=\"", "", "\"|", "", "\n| nowrap data-sort-value=\"", "", "\"|", "" }

tAtt[ 2] = "" tAtt[ 4] = att[2] tAtt[ 6] = att[3]["A"] local durNumb, durHMS = string.match(att[3]["R"]["magic"][1], "^([%d%?]+)([hms])$") local durNumb = tonumber(durNumb) if durHMS == "h" then durNumb = durNumb * 60 end tAtt[13] = durNumb tAtt[15] = att[3]["R"]["magic"][1] tAtt[17] = att[3]["R"]["magic"][2] tAtt[19] = EC({"XP"}) .. tAtt[17] tAtt[21] = att[3]["R"]["magic"][3] tAtt[23] = EC({"Magic"}) .. tAtt[21] tAtt[25] = math.floor((tAtt[21] / (durNumb / 60)) + 0.5) tAtt[27] = EC({"Magic"}) .. tAtt[25] table.insert(tOut, table.concat(tAtt)) end return table.concat(tOut) .. "\n|}" end

function p.getEnchList(frame) local tArgs = util.getArgs(frame) local buildings = {} local tOut = {	'{| class="article-table dmk-list2 sortable" style="width: 100%;"\n', '! width="10%"|Collection\n', '! width="20%"|Name\n', '! width="10%" class="unsortable"|Building\n', '! width="10%" class="unsortable" colspan="2"|Level 1\n', '! width="10%" class="unsortable" colspan="2"|Level 2\n', '! width="10%" class="unsortable" colspan="2"|Level 3\n', '! width="10%" class="unsortable" colspan="2"|Level 4\n', '! width="10%" class="unsortable" colspan="2"|Level 5', }	local tEnch = {} for item, data in pairs(tArgs) do   	if attrData[item] and attrData[item]["R"]["magic"] then local collNumb = collectionData["Items"][item][1] or "0" table.insert(buildings, {collNumb, mw.ustring.gsub(mw.ustring.lower(item), "[':\"%,%.]", "") ,item, data})   	end	end	table.sort(buildings, function(a,b) return a[2] < b[2] end)    for _, att in pairs(buildings) do		tEnch = {"\n|-\n| data-sort-value=\"", att[1], "\"|", "",				"\n| data-sort-value=\"", att[2], "\"|", "", "  ", "", " ",				"\n| nowrap style=\"line-height: 1.5;\"|", "", "    ", EC({"Magic"}), "", " (Every ", "", ") ",				"\n| nowrap|+", "",				"\n| nowrap|", EC({"Magic"}), "", " (+", EC({"Magic", nil, nil, nil, "20"}), "", ") ",				"\n| nowrap|+", "",				"\n| nowrap|", EC({"Magic"}), "", " (+", EC({"Magic", nil, nil, nil, "20"}), "", ") ",				"\n| nowrap|+", "",				"\n| nowrap|", EC({"Magic"}), "", " (+", EC({"Magic", nil, nil, nil, "20"}), "", ") ",				"\n| nowrap|+", "",				"\n| nowrap|", EC({"Magic"}), "", " (+", EC({"Magic", nil, nil, nil, "20"}), "", ") ", "\n| nowrap|", TOK({"two chances"}), "\n| nowrap|", EC({"Magic"}), "", " (+", EC({"Magic", nil, nil, nil, "20"}), "", ") ", }

tEnch[ 4] = COLL({att[3], "P"}) tEnch[ 8] = "" tEnch[10] = att[3] local No = 0 local tMag = attrData[att[3]]["R"]["magic"][3] for item in mw.text.gsplit(att[4], "%s*%$%s*") do   		local iTok, iMag = mw.ustring.match(item, "^([^+]-)%s*+%s*,*%s*([\/%d]*)$") if iTok then tMag = tMag + iMag tEnch[21 + No] = TOK({iTok}) tEnch[24 + No] = tMag tEnch[27 + No] = iMag No = No + 9 else if tonumber(item) then tMag = tMag + item tEnch[60] = tMag tEnch[63] = item else tEnch[13] = TOK({item}) tEnch[16] = tMag end end end tEnch[18] = attrData[att[3]]["R"]["magic"][1] table.insert(tOut, table.concat(tEnch)) end return table.concat(tOut) .. "\n|}" end

return p