Module:Aichan:修订间差异

来自Arcaea中文维基
(bruh bruh)
标签撤销
(bruh bruh bruh)
第16行: 第16行:
randomizer.z=(170*randomizer.z)%30323
randomizer.z=(170*randomizer.z)%30323
return ((randomizer.x/30269+randomizer.y/30307+randomizer.z/30323)%1)
return ((randomizer.x/30269+randomizer.y/30307+randomizer.z/30323)%1)
end
function dateStringToTime(date)
if date==nil then return nil end
local y,m,d = string.match(date, "([^/]+)/([^/]+)/([^/]+)")
return os.time({year=y,month=m,day=d,hour=12,min=30});
end
end


第24行: 第30行:


function p._main(args)
function p._main(args)
-- arg: time, unix 时间戳
-- args:
--  不传入则使用 当前时间
--   time: unix时间戳
local time = args['time'] or os.time()
--    date: YYYY/MM/DD格式的时间, 按这一天的北京时间12:30算
-- 优先级: time > date > 读取 当前时间
local time = args['time'] or dateStringToTime(args['date']) or os.time()
local seed = math.floor((time-144e2)/864e2)
local seed = math.floor((time-144e2)/864e2)
initRandomizer(seed)
initRandomizer(seed)

2024年4月11日 (四) 15:09的版本

可在Module:Aichan/doc创建此模块的帮助文档

local getArgs = require('Module:Arguments').getArgs
local songlist = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ).songs
local mad = require 'Module:AnotherData'
local p={}
local randomizer={}

function initRandomizer(seed)
	randomizer.x=seed
	randomizer.y=seed
	randomizer.z=seed
end

function getNext()
	randomizer.x=(171*randomizer.x)%30269
	randomizer.y=(172*randomizer.y)%30307
	randomizer.z=(170*randomizer.z)%30323
	return ((randomizer.x/30269+randomizer.y/30307+randomizer.z/30323)%1)
end

function dateStringToTime(date)
	if date==nil then return nil end
	local y,m,d = string.match(date, "([^/]+)/([^/]+)/([^/]+)")
	return os.time({year=y,month=m,day=d,hour=12,min=30});
end

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

function p._main(args)
	-- args:
	--     time: unix时间戳
	--     date: YYYY/MM/DD格式的时间, 按这一天的北京时间12:30算
	-- 优先级: time > date > 读取当前时间
	local time = args['time'] or dateStringToTime(args['date']) or os.time()
	local seed = math.floor((time-144e2)/864e2)
	initRandomizer(seed)
	local length=5000
	local arr={}
	for i=0,length-1,1 do
		arr[i]=i
	end
	for i=length-1,1,-1 do
		local r=getNext()
		local swapPos=math.floor(r*i)
		local temp=arr[i]
		arr[i]=arr[swapPos]
		arr[swapPos]=temp
	end
	local result={}
	local resultIndex=0
	local remainPaidCount=2
	local remainFreeCount=1
	local songSize=table.getn(songlist)
	for i=0,length-1,1 do
		if resultIndex>=3 then break end
		local value=arr[i]
		if value<songSize then
			local info=songlist[value+1]
			if info.set=='base' or info.id=='innocence' then
				if remainFreeCount>0 then
					remainFreeCount=remainFreeCount-1
					resultIndex=resultIndex+1
					result[resultIndex]=info
				end
			else
				if remainPaidCount>0 then
					remainPaidCount=remainPaidCount-1
					resultIndex=resultIndex+1
					result[resultIndex]=info
				end
			end
		end
	end
	local frame = mw.getCurrentFrame()
	local text = mw.html.create 'div'
	text=text:wikitext(frame:expandTemplate {title = '组排列', args = {height = 'auto'}})
	for i=1,3,1 do
		local id=result[i].id
		local title=result[i].title_localized.en
		local link=mad.linkName(result[i]) or title
		text:wikitext(frame:expandTemplate {title = '组排单元', args = {title,id,link=link}})
	end
	text = text:wikitext(frame:expandTemplate {title = '组排列-end'}):done()
	return text
end

return p