Module:DesignerSong:修订间差异
Economy666(讨论 | 贡献) (append test) |
Economy666(讨论 | 贡献) 小无编辑摘要 |
||
第20行: | 第20行: | ||
local songDiffDesigner={} | local songDiffDesigner={} | ||
local specialDesigner ={} | local specialDesigner ={} | ||
local LinkedDesignerMemory={} | local LinkedDesignerMemory={['/']='/'} | ||
local bydAppendInfo={} | local bydAppendInfo={} | ||
2024年7月26日 (五) 14:45的版本
可在Module:DesignerSong/doc创建此模块的帮助文档
p={}
local DL = mw.loadJsonData 'User:Economy666/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:沙盒/Economy666/CL'
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
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
-- for _, song in ipairs(mad.listOf('songs', 'ns')) do
-- if not mobileList[song.id] and not multiId[song.id] then
-- for _,level in ipairs(song.difficulties) do
-- local designer = level.chartDesigner
-- local diff = level.ratingClass
-- if lastDesigner ~= designer then
-- sameCount = 0
-- if not pickList[designer] then
-- pickList[designer] = {}
-- end
-- if not pickList[designer][song.id] then
-- pickList[designer][song.id] = {}
-- end
-- pickList[designer][song.id][diffList[diff+1]]=true
-- table.insert(songDiffDesigner[song.id].data, {diffList[diff+1], linkDesigner(designer, song.id)})
-- if specialSong[song.id] then
-- specialDesigner[designer]=true
-- end
-- lastDesigner=designer
-- else
-- sameCount=sameCount+1
-- table.insert(songDiffDesigner[song.id].data, {diffList[diff+1], nil})
-- songDiffDesigner[song.id].data[num-sameCount+1][3]=sameCount+1
-- end
-- num=num+1
-- end
-- 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 = '\n{| 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
local sectionCode = {unknown = 0, free = 1, archive = 2, mainstory = 3, sidestory = 4, collab = 5, single = 6}
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']] or 100, packItem['numero'] or 100, sortLevel, songid}})
end
table.sort(songSort, sort_fun)
return songSort
end
function p.main(frame)
local parentArgs = frame:getParent().args
local Args = frame.args
local function getDescription(title)
return parentArgs[title .. '.description'] 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] and data[1][3]==3 and #data==3 then
local PST_PRS_FTR = color(diffList[1],'全')..color(diffList[2],'难')..color(diffList[3],'度')
-- local PST_PRS_FTR = '全难度'
local style = '|style="height: 35px"'
return '|-\n'.. style ..'|[['..name..']]||'..pack..'||'..PST_PRS_FTR..'||'..data[1][2]..'\n|'..text..'\n|-\n'
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
wikiText = wikiText ..style
if nameBYD[1] and i[1] == 'BYD' then
wikiText = wikiText ..'|'..'[['..(nameBYD[1] or '')..']]'..'\n'
-- j = j + 1
end
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, titelStr)
local theText = ''
local function writeText(designer, songs)
local songSort = getSongSort(songs)
theText = theText .."\n"..titelStr.. designer..titelStr.."\n"
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 .. '|}'
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)
end
end
return theText
end
local desiredOrder = {
"Nitro",
"Toaster",
"Kurorak",
"k//eternal",
"TaroNuke",
"Exschwasion",
"CERiNG",
"antymis",
"Luxance",
"KLMNOP",
"Dec18"
}
local rare = {
"Kero",
"écologie"
}
local uncommon_end = {
"与主线剧情相关的特殊名义",
"其他未确认谱师名义"
}
local commonText = cateText(desiredOrder, '==')
local rareTitle = '已确认的其他谱师名义及相关曲目名单'
local rareText = '\n=='.. rareTitle .. '==\n' .. getDescription(rareTitle)
rareText = rareText .. cateText(rare, '===')
local uncommonTitle = '未采用常驻谱师名义的曲目名单及所用名义'
local uncommonText = '\n=='.. uncommonTitle .. '==\n' .. getDescription(uncommonTitle)
local endText = cateText(uncommon_end, '===')
uncommonText = uncommonText ..cateText(nil, '===')..endText
return commonText..rareText..uncommonText
-- return tableToString(appendList) ..'\n'..commonText..rareText..uncommonText
end
return p