156 lines
2.8 KiB
Lua
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 |