打开主菜单
首页
随机
登录
设置
关于Arcaea中文维基
免责声明
搜索
查看“Module:DesignerSong”的源代码
←
Module:DesignerSong
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
p={} local DL = mw.loadJsonData 'Template:DesignersList.json' local multiId = mw.loadJsonData 'Template:Transition.json'.multiId local trans = mw.loadJsonData 'Template:Transition.json' local mad = require 'Module:AnotherData' local data = require "Module:Arcaea Data" local CL = require 'Module:ConvertLink' local CDL = DL.complex local SDL = DL.simple local specialSong = DL.special local queryMO = data.allSongInformation("id", "mobile") local queryNS = data.allSongInformation("id", "ns") local diffList = {'PST', 'PRS', 'FTR', 'BYD', 'ETR'} local diffNameList = {PST='Past', PRS='Present', FTR='Future', BYD='Beyond', ETR='Eternal'} local bydAppend = {[284]='last'} local songDiffDesigner={} local specialDesigner ={} local LinkedDesignerMemory={['/']='/'} local bydAppendInfo={} local function linkDesigner(designer, songid) if LinkedDesignerMemory[designer] then return LinkedDesignerMemory[designer] end local Linked = CL.designerLink(designer, songid) LinkedDesignerMemory[designer] = Linked return Linked end local function readList(appendList) local pickList = {} local mobileList = {} local listMO = mad.listOf('songs', 'mobile') local function write(songid, songDiffList) songDiffDesigner[songid]={} local num, sameCount = 0,0 local lastDesigner = nil for _,level in ipairs(songDiffList) do local diff = diffList[level.ratingClass+1] local designer = level.chartDesigner num=num+1 if lastDesigner ~= designer then sameCount = 0 if not pickList[designer] then pickList[designer] = {} end if not pickList[designer][songid] then pickList[designer][songid] = {} end pickList[designer][songid][diff]=true mobileList[songid]=true table.insert(songDiffDesigner[songid], {diff, linkDesigner(designer, songid)}) if specialSong[songid] then specialDesigner[designer]=true end lastDesigner=designer else sameCount=sameCount+1 table.insert(songDiffDesigner[songid], {diff, nil}) -- if songDiffDesigner[songid][num-sameCount] then songDiffDesigner[songid][num-sameCount][3]=sameCount+1 -- end -- songDiffDesigner[songid][num][3]=sameCount+1 end end end for index, id in pairs(bydAppend) do bydAppendInfo[id] = listMO[index].difficulties[4] bydAppendInfo[id].id=listMO[index].id end for index, song in ipairs(listMO) do if not song.deleted then local songid = song.id local songDiffList = song.difficulties if bydAppendInfo[songid] then table.insert(songDiffList,bydAppendInfo[songid]) end if not bydAppend[index] then write(songid, songDiffList) end end end -- 有独占ns曲目再启用 -- for index, song in ipairs(listNS) do -- local songid = song.id -- local songDiffList = song.difficulties -- if not mobileList.songid then -- write(songid, songDiffList) -- end -- end for songid, songDiffList in pairs(appendList) do write(songid, songDiffList) end return pickList end local function genList(pickList) local function cate(singleList, cArtist, artist) local artist = artist or cArtist if not singleList[artist] then singleList[artist] = {} end for id,diff in pairs(pickList[cArtist]) do singleList[artist][id]=diff end return singleList end local singleList = {} for cDesigner,songids in pairs(pickList) do local designerList={} if CDL[cDesigner] then if CDL[cDesigner].__FullData__ then for _,text in pairs(CDL[cDesigner].__FullData__) do if text.link then local designer = text['link'] if not designerList[designer] then singleList = cate(singleList, cDesigner, designer) designerList[designer]=true end end end else for link in pairs(CDL[cDesigner]) do local designer = link if not designerList[designer] then singleList = cate(singleList, cDesigner, designer) designerList[designer]=true end end end else local temp_text = cDesigner local count = 0 for _,data in ipairs(SDL) do local designer = data.link local dis = data.display if string.find(temp_text, dis) then singleList = cate(singleList, cDesigner, designer) designerList[designer]=true temp_text = string.gsub(temp_text, dis, '') count = count + 1 end end if count == 0 then if specialDesigner[cDesigner] then singleList = cate(singleList, cDesigner, '与主线剧情相关的特殊名义') else singleList = cate(singleList, cDesigner, '其他未确认谱师名义') end end end end return singleList end -- Function to convert table to string -- local function t2s(tbl, indent) -- indent = indent or 0 -- local toPrint = string.rep(" ", indent) .. "{\n" -- for k, v in pairs(tbl) do -- local keyString = tostring(k) -- local valueString -- if type(v) == "table" then -- valueString = t2s(v, indent + 2) -- else -- valueString = tostring(v) -- end -- toPrint = toPrint .. string.rep(" ", indent + 2) .. "[" .. keyString .. "] = " .. valueString .. ",\n" -- end -- toPrint = toPrint .. string.rep(" ", indent) .. "}" -- return toPrint -- end local function songTitle(id,byd) local display local title = queryMO(id, 'title') or queryNS(id, 'title') if byd then display = queryMO(id, 'bydSongName') -- 如果有新的ns独占byd曲目再使用 -- display = queryMO(id, 'bydSongName') or queryNS(id, 'bydSongName') or 'cant find BYD' if not display then return nil end else display = title end local res = trans.songNameToDisplayName[title] if res then return res..'|'..display end res = trans.sameName[title] if res then return res[id]..'|'..display end if title then return title..'|'..display else return nil end end local function songPack(id) local packid,plat,isNS -- if queryNS(id, 'set') then -- packid = queryNS(id, 'set') -- plat = 'ns' -- isNS = 1 if queryMO(id, 'set') then packid = queryMO(id, 'set') else return nil end local packName = trans.packName[packid] or mad.packQueryWrap(packid, plat).name local packLink = CL.packLink(packName,1,isNS) return packLink end local head = '{| class="wikitable" border="1" cellspacing="1" cellpadding="5" style="text-align:center" width="100%"\n' head = head .. '! width="20%" style="position:-webkit-sticky;position:sticky;top:0px;" |曲名 \n' head = head .. '! width="20%" style="position:-webkit-sticky;position:sticky;top:0px;" |所属曲包 \n' head = head .. '! colspan="2" width="40%" style="position:-webkit-sticky;position:sticky;top:0px;" |谱师名义 \n' head = head .. '! width="20%" style="position:-webkit-sticky;position:sticky;top:0px;" |备注 \n' local ratingSortMemory ={} local function ratingSort(rating) local findInMemory = ratingSortMemory[rating] if findInMemory then return findInMemory end local num if string.find(rating, '+') then num = tonumber(string.match(rating,'%d+'))*2 +1 else num = tonumber(rating)*2 end ratingSortMemory[rating] = num return num end function p.main(frame) local parentArgs = frame:getParent().args local Args = frame.args local function getOrder(name) local orderArg = Args[name] if orderArg then return mw.text.split(orderArg,'\n') end end local function getDescription(title) return parentArgs[title .. '.description'] and parentArgs[title .. '.description']..'\n' or '' end local function getText(dasigner, songid) local argName = dasigner..'.'..songid .. '.text' return parentArgs[argName] or '<span title="'.. argName .. '">-</span>' end local function color(diff,theText) theText = theText or (diffNameList[diff] or '?') return frame:expandTemplate{ title = "color", args = {diff, theText} } end local append = Args['appendList'] local appendList = {} if append then local list = mw.text.split(append,'\n') for _,id in pairs(list) do appendList[id] = {} local designerList = {} for i=0,4 do local diffDesigner = Args[id .. '.'.. i ..'.designer'] if diffDesigner then table.insert(designerList,{ratingClass = i, chartDesigner = diffDesigner}) -- chartDesigner ratingClass end end -- appendList[id].pack = Args[id .. '.pack'] appendList[id] = designerList end end local pickList = readList(appendList) local singleList = genList(pickList) local function songUnit(songid,text) if not songDiffDesigner[songid] then return '' end local data = songDiffDesigner[songid] local name = songTitle(songid) or Args[songid .. '.title'] or '???' local nameBYD = {songTitle(songid,true)} table.insert(nameBYD, bydAppendInfo[songid] and songTitle(bydAppendInfo[songid].id)) local pack = songPack(songid) or Args[songid .. '.pack'] or '/' if data[1][3]==#data then local times = #data local row = #nameBYD+1 local rowspan = 'rowspan='.. row ..'|' local diffTag = color(data[times][1],'全难度') local style = '|style="height: 35px"' local Text = '|-\n'.. style ..'|[['..name..']]||'..rowspan..pack..'||width="10%" '..rowspan..diffTag..'||'..rowspan..data[1][2]..'\n|'..rowspan..text..'\n|-\n' if nameBYD[1] then for _,bydName in ipairs(nameBYD) do Text = Text .. '|[['..bydName..']]\n|-\n' end end return Text end local row = #data local wikiText = '' local rowspanSong = nameBYD and ('|rowspan='.. row-#nameBYD ..'|') or ('|rowspan='.. #data ..'|') local rowspan ='|rowspan='.. row ..'|' wikiText = wikiText .. '|-\n'..rowspanSong ..'[['..name..']]'..'\n' wikiText = wikiText .. rowspan ..pack ..'\n' local j = 1 local style='|style="height: 15px" width="10%"' for num, i in ipairs(data) do if nameBYD[1] and i[1] == 'BYD' then wikiText = wikiText ..'|'..'[['..(nameBYD[j] or '')..']]'..'\n' j = j + 1 end wikiText = wikiText ..style local diffFormat = '|'..(i[1] and color(i[1]) or '') local designerFormat = i[3] and '||rowspan='.. i[3] ..'|' ..i[2] or (i[2] and '||'..i[2] or '') wikiText = wikiText .. diffFormat ..designerFormat..'\n' wikiText = wikiText .. (num == 1 and rowspan .. (text or '')..'\n' or '') wikiText = wikiText ..'\n|-\n' end return wikiText end local function cateText(cate, titleLv, formatJa) local theText = '' local sectionCode = {unknown = 100, free = 1, archive = 2, mainstory2 = 3, mainstory = 4, sidestory = 5, collab = 6, single = 7} function sort_fun(a, b) a, b = a.sort, b.sort for i = 1, 3 do local d = a[i] - b[i] if d ~= 0 then return d < 0 end end return a[4]<b[4] end local function getSongSort(songs) local songSort = {} for songid, diff in pairs(songs) do local packItem = mad.packQueryWrap(queryMO(songid, 'set'), 'mobile') local sortLevel = ratingSort(queryMO(songid, 'ftrRating') or 0) table.insert(songSort, { id=songid, sort={ sectionCode[packItem['section']], packItem['numero'] or Args[songid..'.sortNum'] or 0, sortLevel, songid }}) end table.sort(songSort, sort_fun) return songSort end local function writeText(designer, songs) local songSort = getSongSort(songs) local designerTitle = designer if formatJa and mw.ustring.match(designer,'[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+') then designerTitle = '-{<span lang="ja">' .. designer .. '</span>}-' end theText = theText .. ('<h%s>%s</h%s>\n'):format(titleLv,designerTitle,titleLv) theText = theText .. getDescription(designer) theText = theText .. head for _,data in ipairs(songSort) do local songid = data.id local text = getText(designer, songid) theText = theText .. songUnit(songid,text) end theText = theText .. '|}\n' end if cate then for _,designer in ipairs(cate) do local songs = singleList[designer] or {} writeText(designer, songs) singleList[designer]=nil end else for designer,songs in pairs(singleList) do writeText(designer, songs) singleList[designer]=nil end end return theText end local common = getOrder("common") local commonText = cateText(common, '2') local rare = getOrder("rare") local rareText='' if rare then local rareTitle = '非常驻谱师' local rareSpanid = '\n<span id="已确认的其他谱师名义及相关曲目名单" />' rareText = rareSpanid.. '\n<h2>'.. rareTitle .. '</h2>\n' .. getDescription(rareTitle) rareText = rareText .. cateText(rare, '3') end local uncommonTitle = '未确认谱师' local uncommonSpanid = '\n<span id="未采用常驻谱师名义的曲目名单及所用名义" />' local uncommonText = uncommonSpanid..'\n<h2>'.. uncommonTitle .. '</h2>\n' .. getDescription(uncommonTitle) local headText = cateText(getOrder("uncommon_head"), '3', true) local endText = cateText(getOrder("uncommon_end"), '3') uncommonText = uncommonText..headText..cateText(nil, '3')..endText return commonText..rareText..uncommonText -- return tableToString(appendList) ..'\n'..commonText..rareText..uncommonText end return p
本页使用的模板:
Module:DesignerSong/doc
(
查看源代码
)
返回
Module:DesignerSong
。