Files
Techmino/parts/player/getSeqGen.lua
2021-03-27 19:27:45 +08:00

156 lines
2.8 KiB
Lua

local ins,rem=table.insert,table.remove
local yield=YIELD
local seqGens={
none=function() while true do yield()end end,
bag=function(P,seq0)
local len=#seq0
local bag={}
while true do
while #P.nextQueue<6 do
if #bag==0 then
for i=1,len do
bag[i]=seq0[len-i+1]
end
end
P:getNext(rem(bag,P:RND(#bag)))
end
yield()
end
end,
his4=function(P,seq0)
local len=#seq0
while true do
while #P.nextQueue<6 do
for n=1,4 do
local j,i=0
repeat
i=seq0[P:RND(len)]
j=j+1
until i~=seq0[1]and i~=seq0[2]and i~=seq0[3]and i~=seq0[4]or j==4
seq0[n]=i
P:getNext(i)
end
end
yield()
end
end,
c2=function(P,seq0)
local len=#seq0
local weight={}
for i=1,len do weight[i]=0 end
while true do
while #P.nextQueue<6 do
local maxK=1
for i=1,len do
weight[i]=weight[i]*.5+P:RND()
if weight[i]>weight[maxK]then
maxK=i
end
end
weight[maxK]=weight[maxK]/3.5
P:getNext(seq0[maxK])
end
yield()
end
end,
rnd=function(P,seq0)
P:getNext(seq0[P:RND(#seq0)])
while true do
while #P.nextQueue<6 do
local len=#seq0
for i=1,4 do
local count=0
repeat
i=seq0[P:RND(len)]
count=count+1
until i~=P.nextQueue[#P.nextQueue].id or count>=len
P:getNext(i)
end
end
yield()
end
end,
mess=function(P,seq0)
while true do
while #P.nextQueue<6 do
P:getNext(seq0[P:RND(#seq0)])
end
yield()
end
end,
reverb=function(P,seq0)
local bufferSeq,bag={},{}
while true do
while #P.nextQueue<6 do
if #bag==0 then
for i=1,#seq0 do bufferSeq[i]=seq0[i]end
repeat
local r=rem(bufferSeq,P:RND(#bag))
local p=1
repeat
ins(bag,r)
p=p-.15-P:RND()
until p<0
until #bufferSeq==0
for i=1,#bag do
bufferSeq[i]=bag[i]
end
end
P:getNext(rem(bag,P:RND(#bag)))
end
yield()
end
end,
loop=function(P,seq0)
local len=#seq0
local bag={}
while true do
while #P.nextQueue<6 do
if #bag==0 then
for i=1,len do
bag[i]=seq0[len-i+1]
end
end
P:getNext(rem(bag))
end
yield()
end
end,
fixed=function(P,seq0)
local seq={}
for i=#seq0,1,-1 do
ins(seq,seq0[i])
end
while true do
while #P.nextQueue<6 do
if seq[1]then
P:getNext(rem(seq))
else
if not(P.cur or P.nextQueue[1]or P.holdQueue[1])then
P:lose(true)
end
break
end
end
yield()
end
end,
}
return function(P)--Return a piece-generating funtion for player P
local s=P.gameEnv.sequence
if type(s)=="function"then
return s
elseif type(s)=="string"and seqGens[s]then
return seqGens[s]
else
LOG.print(
type(s)=="string"and
"No sequence mode called "..s or
"Wrong sequence generator",
"warn")
P.gameEnv.sequence="bag"
return seqGens.bag
end
end