跳到内容
折叠侧栏
搜索
创建账号
个人工具
创建账号
登录
导航
首页
最近更改
随机页面
编者用页面
方针
指引
讨论版
格式手册
挂起清单
维护清单
玩法条目
游戏玩法
界面
机制
搭档
潜力值
Link Play
世界模式
故事模式
段位挑战
解歌系统
成就系统
版本更新日志
列表条目
定数表
曲目列表
曲包列表
曲师列表
谱师列表
画师列表
背景列表
友情链接
Rotaeno中文维基
工具
链入页面
相关更改
特殊页面
页面信息
查看“Module:SongCollectionMulti”的源代码
模块
讨论
English
阅读
查看源代码
查看历史
更多
阅读
查看源代码
查看历史
←
Module:SongCollectionMulti
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
local mad = require 'Module:AnotherData' local cLink = require 'Module:ConvertLink' local cal = mw.loadJsonData 'Template:ComplexArtistsList.json' local trans = mw.loadJsonData 'Template:Transition.json' local SL = mw.loadJsonData 'Template:Song Length.json' local VT = mw.loadJsonData 'Template:VersionTime.json' local lang = mw.language.getContentLanguage() local frame = mw.getCurrentFrame() local p = {} -- 分离双平台页的曲包: local discrete_pack = {Arcaea='', ['Memory Archive']=''} local bydAppend = {last='lasteternity'} -- local dates, versionNames = {}, {} -- local function verQuery(sec) -- local date = tonumber(lang:formatDate('ymd', '@' .. sec)) - 1 -- if date > dates[#dates] then return '@' end -- local l, r = 1, #dates -- while l < r do -- local m = math.floor((l + r) / 2) -- if dates[m] < date then -- l = m + 1 -- else -- r = m -- end -- end -- return versionNames[l] -- end local function versionDate(ver, sec) local vt if VT[ver] then vt=VT[ver] else return ver, date end local date = tonumber(lang:formatDate('ymd', '@' .. sec)) - 1 local dates = vt.time local version = vt.ver local nDates = {} for _,d in ipairs(dates) do table.insert(nDates,d) end if date > nDates[#nDates] then return ver, date end if #nDates == 1 then return ver.. '.' ..version[1], dates[1] end local l, r = 1, #nDates while l < r do local m = math.floor((l + r) / 2) if dates[m] < date then l = m + 1 else r = m end end return ver.. '.' ..version[l], dates[l] end local function otherTitles(song) local res = {} local titleJa = song.title_localized.ja if titleJa then table.insert(res, ('<span lang="ja">-{%s}-</span>'):format(titleJa)) end table.insert(res, song.title_localized['zh-Hans']) -- for _, diff in ipairs(song.difficulties) do -- if diff.title_localized then -- table.insert(res, '--<br>'..diff.title_localized.en .. ' ' .. mad.color { -- rc = diff.ratingClass + 1, -- 为什么没有设置成对应关系!?(恼) -- txt = ('[%s]'):format(({[3] = 'Beyond'})[diff.ratingClass]), -- inline = true -- }) -- end -- end return res end local function BYDtag() return mad.color{rc = 4,txt = '[Beyond]',inline = true} end local function link(l, d) if d then return '[[' .. l .. '|' .. d .. ']]' else return '[[' .. l .. ']]' end end local function formatJapaneseText(text) return mw.ustring.gsub( text, '[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+', function(v) return ('<span lang="ja">-{%s}-</span>'):format(v) end ) end local onlyMobile = frame:expandTemplate{title = '仅', args = {'移动版', '', '图片角标'}} local onlyNS = frame:expandTemplate{title = '仅', args = {'NS版', '', '图片角标'}} local ctrlTouch = '[[文件:Icon Touch2.png|16px|top|触摸|link=]]' local ctrlJC = '[[文件:Icon Joy-Con2.png|16px|top|Joy-Con|link=]]' local mobileIcon = '[[文件:Icon Smartphone.png|16px|link=曲目列表 (移动版)]]' local nsIcon = '[[文件:Icon Nintendo switch.png|16px|link=曲目列表 (Nintendo Switch版)]]' local sectionCode = {unknown = 0, free = 1, archive = 2, mainstory = 3, sidestory = 4, collab = 5, single = 6} local function main(args, durArgs) local view = {} -- local plat = 'mobile' -- 不对song下述提及的字段存在性做检验 local multi_song={} local ns_song={} local multi_id={} local mobile_id={} local ns_id={} for _, song in ipairs(mad.listOf('songs', 'mobile')) do mobile_id[song.id] = 1 multi_id[song.id] = 1 multi_song[song.id] = song end for _, song in ipairs(mad.listOf('songs', 'ns')) do ns_id[song.id] = 1 ns_song[song.id] = song if not multi_id[song.id] then multi_id[song.id] = 1 multi_song[song.id] = song end end local ns2mo = trans.multiId local mo2ns = {} for ns,mo in pairs(ns2mo) do mo2ns[mo]=ns end for v in pairs(ns2mo) do multi_song[v] = nil end -- local AB = {} -- for i,j in pairs(bydAppend) do AB[j] = i end for _, song in pairs(multi_song) do local row2 = 'rowspan="2"|' local id = song.id local packItem = mad.packQueryWrap(song.set, 'mobile') local data = setmetatable({}, {__index = table}) local function input(...) return args[table.concat({id, ...}, '.')] end local BydSong, BydRep, BydData, BydTitle, BydSong2, BydData2 if song.difficulties[4] and song.difficulties[4].title_localized and song.difficulties[4].title_localized.en then BydTitle = song.difficulties[4].title_localized.en if id == 'last' then BydTitle = 'Last | Moment' end BydRep = -1 BydSong = song.difficulties[4] BydData = setmetatable({}, {__index = table}) if bydAppend[id] then -- BydId2 = bydAppend[id] -- BydSong2 = multi_song[BydId2] -- BydData2 = setmetatable({}, {__index = table}) row2 = 'rowspan="3"|' end end -- 平台 local display_plat = '' local NSid = id if mobile_id[id] then display_plat = display_plat .. mobileIcon end if ns_id[id] then display_plat = display_plat .. nsIcon elseif mo2ns[id] then display_plat = display_plat .. nsIcon NSid = mo2ns[id] end if display_plat == '' then display_plat = '无' end if BydSong then if ns_song[id] and ns_song[id].difficulties[4] then display_plat = row2 .. display_plat else BydData:insert(mobileIcon) BydRep = BydRep + 1 end end data:insert(display_plat) -- 图片 local pic = ('[[文件:Songs %s.jpg|75px]]'):format(id) if BydSong then local BydPic = ('[[文件:Songs %s_byd.jpg|75px]]'):format(id) -- pic = pic ..'<br>'.. BydPic BydData:insert(BydPic) BydRep = BydRep + 2 if BydSong2 then BydData2:insert(('[[文件:Songs %s.jpg|75px]]'):format(BydId2)) end end data:insert(pic) -- 标题与副标题 otherTitles data:insert(input '标题' or table.concat({'[[' .. mad.linkTitle(song) .. ']]', unpack(otherTitles(song))}, '<br>')) if BydSong then BydData:insert('[[' ..mad.linkTitle(song)..'|'..BydTitle.. ']]') end -- 曲师 local artist = cLink.artistLink(song.artist) local BydArtist if BydSong then BydArtist = cLink.artistLink(BydSong.artist or nil) if BydArtist == artist then BydArtist = nil end if BydArtist then BydData:insert(BydArtist) BydRep = BydRep + 1 else artist = row2 .. artist end end -- local allArtist = artist .. (BydArtist and '<br>--<br>' .. BydArtist .. BYDtag() or '') data:insert(input '音乐家' or artist) -- 曲包 local pack_main = trans.packName[song.set] or packItem['name'] local pack_ml = cLink.packLink(pack_main,1) if mobile_id[id] and ns_id[NSid] then local song_ns = ns_song[NSid] local packItem_ns = mad.packQueryWrap(song_ns.set, 'ns') local pack_ns = trans.packName[ns_song[NSid].set] or packItem_ns['name'] local pack_nl = cLink.packLink(pack_ns,1,1) if pack_ns == pack_main then if discrete_pack[pack_main] then pack = pack_ml .. onlyMobile .. '<br \>--<br \>' ..pack_nl .. onlyNS else pack = pack_ml end else pack = pack_ml .. onlyMobile .. '<br \>--<br \>' .. pack_nl .. onlyNS end elseif mobile_id[id] then pack = pack_ml .. onlyMobile else pack = pack_ml .. onlyNS end if BydSong then pack = row2 .. pack end data:insert(input '所属曲包' or pack) -- 其他信息 local bpm = tonumber(input 'BPM') or song.bpm local length = (durArgs[id] or SL.normal[id] or ' @ ') .. (bydLength or '') local ver = versionDate(song.version, song.date) local bydBpm, bydVer, bydLength if BydSong then if BydSong.bpm then BydData:insert(BydSong.bpm) BydRep = BydRep + 1 else bpm = row2 .. bpm end if SL.beyond[id] and SL.beyond[id]~=length then -- bydLength = '<br>--<br>'..SL.beyond[id] ..'<br>'.. BYDtag() or '' BydData:insert(SL.beyond[id]) BydRep = BydRep + 1 else length = row2 .. length end if BydSong.version and BydSong.date then -- bydVer='<br>--<br>'..versionDate(BydSong.version, BydSong.date)..'<br>'..BYDtag() or '' bydVer=versionDate(BydSong.version, BydSong.date) BydData:insert(bydVer) BydRep = BydRep + 1 else ver = row2 .. ver end end data:insert(bpm) data:insert(length) data:insert(input '收录版本' and song.version .. '.' .. input '收录版本' or ver) -- 难度等级 local main_lv = {} local lv_table ={} for _,diff in pairs(song.difficulties) do main_lv[diff.ratingClass] = diff.rating .. (diff.ratingPlus and '+' or '') end if mobile_id[id] and ns_id[NSid] then local song_ns = ns_song[NSid] local ns_lv = {} local c_chart = {} for _,diff in pairs(song_ns.difficulties) do ns_lv[diff.ratingClass] = diff.rating .. (diff.ratingPlus and '+' or '') if diff.has_controller_alt_chart then c_chart[diff.ratingClass] = 1 end end for i = 0, 4 do local lv if main_lv[i] and ns_lv[i] then if main_lv[i] == ns_lv[i] then lv = main_lv[i] .. (c_chart[i] and ('<br />' .. ctrlTouch .. ctrlJC) or '') else -- lv = main_lv[i] .. onlyMobile .. '<br />' .. ns_lv[i] .. (c_chart[i] and (ctrlTouch ..onlyNS .. '<br />' .. ns_lv[i] .. ctrlJC .. onlyNS) or onlyNS) lv = main_lv[i] .. onlyMobile .. '<br \>' .. ns_lv[i] .. onlyNS .. (c_chart[i] and ('<br />' .. ctrlTouch ..ctrlJC) or '') end elseif main_lv[i] then lv = main_lv[i] .. onlyMobile elseif ns_lv[i] then lv = ns_lv[i] .. onlyNS else lv = '/' end lv_table[i] = lv end else for i = 0, 4 do local lv = main_lv[i] or '/' lv_table[i] = lv end end -- 顺序:PST PRS FTR ETR BYD local lv_order = {0, 1, 2, 4, 3} for i=1, #lv_order do local j = lv_order[i] Lv = input('等级', j) or lv_table[j] if BydSong then if j==3 then data:insert('/') BydData:insert(Lv == '0' and '/' or Lv) if BydSong2 then BydData2:insert('/') end else data:insert(Lv == '0' and '/' or Lv) BydData:insert('/') if BydSong2 then BydData2:insert('/') end end BydRep = BydRep + 1 else data:insert(Lv == '0' and '/' or Lv) end end if id == 'lasteternity' then bydAppend.last = {} bydAppend.last.BydData2 = {data[2],data[3],data[9],data[10],data[11],data[12],data[13]} bydAppend.last.BydRep2 = 6 else table.insert(view, { id = id, BydData = BydData, BydRep = BydRep, data = data, sort = {sectionCode[packItem['section']], packItem['numero'], song.date} }) end end table.sort(view, function(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 false end) local res = {} local template = '|-\n|%s' .. ('||%s'):rep(12) for idx, value in ipairs(view) do res[idx] = template:format(unpack(value.data)) if value.BydData then res[idx] =res[idx] .. ('\n|-\n|%s' .. ('||%s'):rep(value.BydRep)):format(unpack(value.BydData)) if bydAppend[value.id] then res[idx] =res[idx] .. ('\n|-\n|%s' .. ('||%s'):rep(bydAppend[value.id].BydRep2)):format(unpack(bydAppend[value.id].BydData2)) end end end return table.concat(res, '\n') end function p.multi(frame) -- for record in mw.text.gsplit(frame.args._ver_, '%s') do -- local date, name = record:match '(%d+):(.*)' -- table.insert(dates, tonumber(date)) -- table.insert(versionNames, name) -- end return main(frame:getParent().args, frame.args) end return p
本页使用的模板:
Module:SongCollectionMulti/doc
(
查看源代码
)
返回
Module:SongCollectionMulti
。