Item
来自蒙纳多研究本部
此模块的文档可以在模块:Item/doc创建
local p = {} local post = require("Module:RequestHelper").post local getArgs = require("Module:Arguments").getArgs local html = require("Module:Html") local compress = html.compress local addlink = html.addlink local function itemName(data) local name = data.itemID.name if data.rankType > 0 then name = name .. data.rankType end return name end local function obtain(data) -- 获得方式 local title = mw.title.getCurrentTitle() local drop do local header = {{label = "敌人", scope = "page"}, {label = "等级", scope = "Lv"}, {label = "地区", scope = "Map"}} if data.itemID.uni_flag == 0 then table.insert(header, {label = "插槽", scope = "slot"}) drop = {} for i = 0, data.itemID.jwl_slot_max do local res = mw.smw.ask { "[[DropWpn::" .. title.text .. "[" .. i .. "] ]] OR [[DropEquip::" .. title.text .. "[" .. i .. "] ]]", "?lv", "?map", "mainlabel=page", "sort=id" } if res then for _, v in ipairs(res) do v.slot = i table.insert(drop, v) end end end else drop = mw.smw.ask { "[[DropUniWpn::" .. title.text .. " ]] OR [[DropUniEquip::" .. title.text .. " ]]", "?lv", "?map", "mainlabel=page", "sort=id" } or {} end if #drop > 0 then for i, _ in ipairs(drop) do if type(drop[i].Lv) == "table" then drop[i].Lv = table.concat(drop[i].Lv, "<br>") end if type(drop[i].Map) == "table" then drop[i].Map = table.concat(drop[i].Map, "<br>") elseif drop[i].Map == nil then drop[i].Map = "" end end drop = mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, drop, {class = "xbtable"})) else drop = "" end end local npc do local header = {{label = "NPC交换", scope = "page"}, {label = "地区", scope = "Area"}} if data.itemID.uni_flag == 0 then table.insert(header, {label = "插槽", scope = "slot"}) npc = {} for i = 0, data.itemID.jwl_slot_max do local res = mw.smw.ask { "[[exchange5::" .. title.text .. "[" .. i .. "] ]] OR [[Present::" .. title.text .. "[" .. i .. "] ]]", "?Area", "mainlabel=page", "sort=id" } if res then for _, v in ipairs(res) do v.slot = i table.insert(npc, v) end end end else npc = mw.smw.ask { "[[exchange5::" .. title.text .. " ]] OR [[Present::" .. title.text .. " ]]", "?Area", "mainlabel=page", "sort=id" } or {} end if #npc > 0 then for i, _ in ipairs(npc) do if type(npc[i].Area) == "table" then npc[i].Area = table.concat(npc[i].Area, "<br>") elseif npc[i].Area == nil then npc[i].Area = "" end end npc = mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, npc, {class = "xbtable"})) else npc = "" end end local quest do local header = {{label = "任务报酬", scope = "page"}, {label = "NPC", scope = "Npc"}} if data.itemID.uni_flag == 0 then table.insert(header, {label = "插槽", scope = "slot"}) quest = {} for i = 0, data.itemID.jwl_slot_max do local res = mw.smw.ask { "[[任务:+]][[Reward::" .. title.text .. "[" .. i .. "] ]]", "?Npc", "mainlabel=page", "sort=id" } if res then for _, v in ipairs(res) do v.slot = i table.insert(quest, v) end end end else quest = mw.smw.ask { "[[任务:+]][[Reward::" .. title.text .. " ]]", "?Npc", "mainlabel=page", "sort=id" } or {} end if #quest > 0 then for i, _ in ipairs(quest) do if type(quest[i].Npc) == "table" then quest[i].Npc = table.concat(quest[i].Npc, "<br>") elseif quest[i].Npc == nil then quest[i].Npc = "" end end quest = mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, quest, {class = "xbtable"})) else quest = "" end end local shop do local header = {{label = "商店", scope = "page"}} if data.itemID.uni_flag == 0 then table.insert(header, {label = "插槽", scope = "slot"}) shop = {} for i = 0, data.itemID.jwl_slot_max do local res = mw.smw.ask { "[[Item::" .. title.text .. "[" .. i .. "] ]]", "mainlabel=page", "sort=id" } if res then for _, v in ipairs(res) do v.slot = i table.insert(shop, v) end end end else shop = mw.smw.ask { "[[Item::" .. title.text .. " ]]", "mainlabel=page", "sort=id" } or {} end if #shop > 0 then shop = mw.ustring.format([[<div class="large-6 columns">%s</div>]], html.wikitable(header, shop, {class = "xbtable"})) else shop = "" end end if #drop > 0 or #npc > 0 or #quest > 0 or #shop > 0 then return mw.ustring.format( [[ %s <div class="row"> %s %s %s %s </div> ]], html.h2("获得方式"), drop, npc, quest, shop ) else return "" end end function p.weapon(frame, data) mw.smw.set { id = data.row_id, itemType = data.itemType, MinAttack = data.itemID.dmg_low, MaxAttack = data.itemID.dmg_hi, PhysicalDef = data.itemID.arm_phy, EtherDef = data.itemID.arm_eth, CriticalRate = data.itemID.att_lev, BlockRate = data.itemID.grd_rate } if data.itemID.pcid then mw.smw.set { pc = data.itemID.pcid.name, ["appearance/" .. data.itemID.pcid.row_id] = data.itemID.style and data.itemID.style.name or nil } end local wikitext = "" local info = data.comment local jwl = "" if data.itemID.uni_flag == 0 then jwl = data.itemID.jwl_slot_max else local jwlArr = {} for i = 1, 3 do local jwl_skill = data.itemID["jwl_skill" .. i] if jwl_skill then table.insert(jwlArr, jwl_skill.itemID.name .. jwl_skill.rankType .. " (" .. jwl_skill.percent .. "%)") end end jwl = jwl .. table.concat(jwlArr, "<br>") end mw.smw.set {jwl = jwl} info = info .. html.wikitable( {"物品分类", "装备角色", "最小攻击力", "最大攻击力", "物理防御", "以太防御", "暴击率", "格挡率", "插槽(最大数)", "造型"}, { { data.itemType, data.itemID.pcid and data.itemID.pcid.name or "", data.itemID.dmg_low, data.itemID.dmg_hi, data.itemID.arm_phy, data.itemID.arm_eth, data.itemID.att_lev, data.itemID.grd_rate, jwl, data.itemID.style and data.itemID.style.name or "" } }, {transpose = true, class = "xbtable"} ) wikitext = wikitext .. mw.ustring.format( [[ <div class="row"> <div class="large-6 columns">%s</div> </div> ]], info ) wikitext = wikitext .. obtain(data) return compress(wikitext) end function p.equip(frame, data) mw.smw.set { id = data.row_id, itemType = data.itemType, equipType = data.itemID.arm_type, PhysicalDef = data.itemID.arm_phy, EtherDef = data.itemID.arm_eth, Weight = data.itemID.eva_rate } local info = data.comment local jwl = "" if data.itemID.uni_flag == 0 then jwl = data.itemID.jwl_slot_max else local jwl_skill = data.itemID.jwl_skill1 jwl = jwl .. jwl_skill.itemID.name .. jwl_skill.rankType .. " (" .. jwl_skill.percent .. "%)" end mw.smw.set {jwl = jwl} info = info .. html.wikitable( {"物品分类", "装备类别", "物理防御", "以太防御", "重量", "插槽(最大数)"}, { { data.itemType, data.itemID.arm_type, data.itemID.arm_phy, data.itemID.arm_eth, data.itemID.eva_rate, jwl } }, {transpose = true, class = "xbtable"} ) local wikitext = mw.ustring.format( [[ <div class="row"> <div class="large-6 columns">%s</div> </div> ]], info ) do local header = {} local body = {} for _, parts in pairs(data.itemID.pc) do if parts.style then table.insert(header, addlink(parts.pcid.name, "", "造型装备/" .. parts.pcid.name)) table.insert(body, parts.style.name) mw.smw.set {["appearance/" .. parts.pcid.row_id] = parts.style.name} end end if #body > 0 then local fashion = html.wikitable(header, {body}, {transpose = true, class = "xbtable"}) wikitext = wikitext .. mw.ustring.format( [[ %s <div class="row"> <div class="medium-6 columns">%s</div> </div> ]], html.h2("造型"), fashion ) end end wikitext = wikitext .. obtain(data) return compress(wikitext) end function p.collection(frame, data) local title = mw.title.getCurrentTitle() local isMelia = "相连的未来" == mw.ustring.sub(tostring(title), 1, 5) local wikitext = "" local area = data.itemID.mapID and data.itemID.mapID.name or "其他" mw.smw.set { id = data.row_id, itemType = data.itemType, area = area, collectionType = data.itemID.type } local info = data.comment info = info .. html.wikitable( {"物品分类", "种类", "产地"}, { { "收藏品", data.itemID.type, area } }, {transpose = true, class = "xbtable"} ) wikitext = wikitext .. mw.ustring.format( [[ <div class="row"> <div class="large-6 columns">%s</div> </div> ]], info ) if not isMelia then wikitext = wikitext .. html.h2("礼物") wikitext = wikitext .. mw.ustring.format( [[ <div class="row"> <div class="large-6 columns">%s</div> </div> ]], html.wikitable( {"角色", "牵绊值"}, { {"修尔克", data.itemID.FSplus1}, {"莱恩", data.itemID.FSplus2}, {"菲奥伦", data.itemID.FSplus3}, {"丹邦", data.itemID.FSplus4}, {"卡露娜", data.itemID.FSplus5}, {"力奇", data.itemID.FSplus6}, {"梅莉亚", data.itemID.FSplus7} }, {class = "xbtable"} ) ) mw.smw.set { FSplus1 = data.itemID.FSplus1, FSplus2 = data.itemID.FSplus2, FSplus3 = data.itemID.FSplus3, FSplus4 = data.itemID.FSplus4, FSplus5 = data.itemID.FSplus5, FSplus6 = data.itemID.FSplus6, FSplus7 = data.itemID.FSplus7 } end wikitext = wikitext .. obtain(data) if data.itemID.mapID then wikitext = wikitext .. html.h2("地图") wikitext = wikitext .. '<div class="xb1map-collection" data-map-name="' .. data.itemID.mapID.id_name .. '" data-highlight-collection="' .. mw.title.getCurrentTitle().text .. '" ></div>' local c6ExtraCollection = { 1854, 1863, 1864, 1868, 1875, 1876, 1877, 1880, 1881, 1882, 1883, 1884, 1885, 1895, 1904, 1905, 1910, 1913, 1914, 1915, 1916, 1920, 1921, 1922, 1923, 1926, 1927, 1933, 1936, 1941, 1942, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1968, 1975, 1980, 1986, 1990, 1991, 1992, 2003, 2008, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2036, 2046, 2055, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2071, 2072, 2083, 2084, 2085, 2086, 2087, 2088, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2105, 2114, 2119, 2129, 2134, 2135, 2136, 2137, 2138, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2149 } for _, id in ipairs(c6ExtraCollection) do if id == data.row_id then wikitext = wikitext .. "<hr>" .. '<div class="xb1map-collection" data-map-name="ma0401" data-highlight-collection="' .. mw.title.getCurrentTitle().text .. '" ></div>' end end end return compress(wikitext) end function p.fetchDataById(id) return post("bdat_common.ITM_itemlist", id) end function p.main(frame) local args = getArgs(frame) local out = "" local id = args[1] local data = p.fetchDataById(id) -- mw.log(mw.text.jsonEncode(data, mw.text.JSON_PRETTY)) if data.itemType == "武器" then out = out .. p.weapon(frame, data) elseif data.itemType == "头部防具" or data.itemType == "身体防具" or data.itemType == "手臂防具" or data.itemType == "腰部防具" or data.itemType == "腿部防具" then out = out .. p.equip(frame, data) elseif data.itemType == "收藏品" then out = out .. p.collection(frame, data) end return out end return p