diff --git a/parts/RSlist.lua b/parts/RSlist.lua index 2c34d5a8..1da08003 100644 --- a/parts/RSlist.lua +++ b/parts/RSlist.lua @@ -830,8 +830,19 @@ do local R=_flipList(L) local F={'+0+0'} local centerPos=TABLE.copy(defaultCenterPos) - centerPos[6]={[0]={0,0},{1,0},{1,1},{0,1}} - centerPos[7]={[0]={0,1},{2,0},{0,2},{1,0}} + centerPos[6]={[0]={0,0},{1,0},{1,1},{0,1}}-- O + centerPos[7]={[0]={0,1},{2,0},{0,2},{1,0}}-- I + centerPos[14]={[0]={0,1},{1,0},{2,1},{1,2}}-- T5 + centerPos[16]={[0]={1,1},{1,1},{1,1},{1,1}}-- V + centerPos[19]={[0]={0,1},{2,0},{1,2},{1,1}}-- J5 + centerPos[20]={[0]={0,2},{1,0},{1,1},{2,1}}-- L5 + centerPos[21]={[0]={0,2},{1,0},{1,1},{2,1}}-- R + centerPos[22]={[0]={0,1},{2,0},{1,2},{1,1}}-- Y + centerPos[23]={[0]={0,1},{2,0},{1,2},{1,1}}-- N + centerPos[24]={[0]={0,2},{1,0},{1,1},{2,1}}-- H + centerPos[27]={[0]={0,1},{0,0},{1,0},{1,1}}-- C + centerPos[28]={[0]={0,1},{0,0},{0,0},{1,0}}-- I2 + ASC={ centerTex=GC.DO{10,10, {'setLW',2}, @@ -857,7 +868,7 @@ do local L={'+0+0','+1+0','+0-1','+1-1','+0-2','+1-2','+2+0','+2-1','+2-2','-1+0','-1-1','+0+1','+1+1','+2+1','-1-2','-2+0','+0+2','+1+2','+2+2','-2-1','-2-2'} local R=_flipList(L) local F={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1','+0-2','-1-2','+1-2','-2+0','+2+0','-2-1','+2-1','-2+1','+2+1','+0+2','-1+2','+1+2'} - local centerPos=TABLE.copy(defaultCenterPos) + local centerPos=TABLE.copy(ASC.centerPos) centerPos[6]={[0]={0,0},{1,0},{1,1},{0,1}} centerPos[7]={[0]={0,1},{2,0},{0,2},{1,0}} ASC_plus={ diff --git a/parts/bot/bot_cc.lua b/parts/bot/bot_cc.lua index df694f85..bc4e4ede 100644 --- a/parts/bot/bot_cc.lua +++ b/parts/bot/bot_cc.lua @@ -43,8 +43,8 @@ function bot_cc:revive() self.P:loadAI(self.data) end function bot_cc:pushNewNext(id) - self.ccBot:addNext(rem(self.bufferedNexts,1)) ins(self.bufferedNexts,id) + self.ccBot:addNext(rem(self.bufferedNexts,1)) end function bot_cc:thread() local P,keys=self.P,self.keys diff --git a/parts/char.lua b/parts/char.lua index 2ef81499..96a41a66 100644 --- a/parts/char.lua +++ b/parts/char.lua @@ -186,12 +186,12 @@ local L={ joystickR= 0xF018A, jsLU= 0xF018B, jsLD= 0xF018C, - jsLL= 0xF018D, - jsLR= 0xF018E, + jsLR= 0xF018D, + jsLL= 0xF018E, jsRU= 0xF018F, jsRD= 0xF0190, - jsRL= 0xF0191, - jsRR= 0xF0192, + jsRR= 0xF0191, + jsRL= 0xF0192, jsLPress= 0xF0193, jsRPress= 0xF0194, dpad= 0xF0195, diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 159b9a9c..d1eee3b2 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -476,7 +476,7 @@ do-- Mod data }, {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', - list={'bag','bagES','his','hisPool','c2','rnd','mess','reverb','bagP1inf'}, + list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, func=function(P,O) P.gameEnv.sequence=O end, unranked=true, }, diff --git a/parts/modes/drought_l.lua b/parts/modes/drought_l.lua index 515bd92d..e1a3b50e 100644 --- a/parts/modes/drought_l.lua +++ b/parts/modes/drought_l.lua @@ -1,78 +1,77 @@ local ins=table.insert +local yield=coroutine.yield return { env={ drop=20,lock=60, - sequence=function(P) - for _=1,3 do P:getNext(7) end + sequence=function(seqRND) + local field,stat + for _=1,3 do field,stat=yield(7) end while true do - coroutine.yield() - if not P.nextQueue[1] then - local height=TABLE.new(0,10) - local max=#P.field - if max>0 then - -- Get heights - for x=1,10 do - local h=max - while P.field[h][x]==0 and h>1 do - h=h-1 - end - height[x]=h - end - else - for x=1,10 do - height[x]=0 + local height=TABLE.new(0,10) + local max=#field + if max>0 then + -- Get heights + for x=1,10 do + local h=max + while field[h][x]==0 and h>1 do + h=h-1 end + height[x]=h end - height[11]=999 - - local wei={1,1,2,2,3,4} - local d=0 - for i=1,10 do - d=d+height[i] + else + for x=1,10 do + height[x]=0 end - if d<40 or P.stat.row>2*42 then-- Low field or almost win, give SZO - for _=1,4 do - ins(wei,1) - ins(wei,2) - ins(wei,6) - end - else - -- Give I when no hole - local tempDeltaHei=-999-- Height difference - for x=2,11 do - local deltaHei=height[x]-height[x-1] - if tempDeltaHei<-2 and deltaHei>2 then - break - elseif x==11 then - for _=1,3 do ins(wei,7) end - else - tempDeltaHei=deltaHei - end - end - - -- Give O when no d=0/give T when no d=1 - local flatCount=0-- d=0 count - local stairCount=0-- d=1 count - for x=2,10 do - local _=height[x]-height[x-1] - if _==0 then - flatCount=flatCount+1 - elseif _==1 or _==-1 then - stairCount=stairCount+1 - end - end - if flatCount<3 then - for _=1,3 do ins(wei,6) end - end - if stairCount<3 then - for _=1,4 do ins(wei,5) end - end - end - P:getNext(wei[P.seqRND:random(#wei)]) end + height[11]=999 + + local wei={1,1,2,2,3,4} + local d=0 + for i=1,10 do + d=d+height[i] + end + if d<40 or stat.row>2*42 then-- Low field or almost win, give SZO + for _=1,4 do + ins(wei,1) + ins(wei,2) + ins(wei,6) + end + else + -- Give I when no hole + local tempDeltaHei=-999-- Height difference + for x=2,11 do + local deltaHei=height[x]-height[x-1] + if tempDeltaHei<-2 and deltaHei>2 then + break + elseif x==11 then + for _=1,3 do ins(wei,7) end + else + tempDeltaHei=deltaHei + end + end + + -- Give O when no d=0/give T when no d=1 + local flatCount=0-- d=0 count + local stairCount=0-- d=1 count + for x=2,10 do + local _=height[x]-height[x-1] + if _==0 then + flatCount=flatCount+1 + elseif _==1 or _==-1 then + stairCount=stairCount+1 + end + end + if flatCount<3 then + for _=1,3 do ins(wei,6) end + end + if stairCount<3 then + for _=1,4 do ins(wei,5) end + end + end + field,stat=yield(wei[seqRND:random(#wei)]) end end, - nextCount=1,holdCount=0, + trueNextCount=1,nextCount=1,holdCount=0, ospin=false, freshLimit=15, eventSet='checkLine_100', diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 37a6f5c3..a9a71898 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -70,6 +70,11 @@ local seqGenBanner=setmetatable({ {'fRect',70-2,5-2,4,4}, {'fRect',80-1,5-1,2,2}, }, + bagP1inf=GC.DO{100,10, + {'fRect',10,4,40,2}, + {'fRect',55,4,20,2}, + {'fRect',80,4,10,2}, + }, rnd=GC.DO{100,10, {'fRect',30-3,1,6,6}, {'fRect',70-3,1,6,6}, @@ -91,10 +96,6 @@ local seqGenBanner=setmetatable({ fixed=GC.DO{100,10, {'fRect',40,4,20,2}, }, - --TODO: add new banner for bagP1inf - bagP1inf=GC.DO{100,10, - {'fRect',40,4,20,2}, - }, },{__index=function(self,k) self[k]=self.none return self.none diff --git a/parts/player/gameEnv0.lua b/parts/player/gameEnv0.lua index 81fac4e1..85fef2dc 100644 --- a/parts/player/gameEnv0.lua +++ b/parts/player/gameEnv0.lua @@ -33,7 +33,7 @@ return { bone=false, lockout=false, fieldH=20,heightLimit=1e99, - nextCount=6,nextStartPos=1, + trueNextCount=10,nextCount=6,nextStartPos=1, holdMode='hold',holdCount=1, infHold=false,phyHold=false, ospin=true,deepDrop=false, diff --git a/parts/player/init.lua b/parts/player/init.lua index 50e15a39..37af538b 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -328,17 +328,32 @@ local function _applyGameEnv(P)-- Finish gameEnv processing ENV.nextPos=false end - P.newNext=coroutine.wrap(getSeqGen(P)) - P:newNext(P.gameEnv.seqData) - if ENV.noInitSZO then - for _=1,5 do - local C=P.nextQueue[1] - if C and (C.id==1 or C.id==2 or C.id==6) then - table.remove(P.nextQueue,1) - else - break - end + local seqGen=coroutine.create(getSeqGen(ENV.sequence)) + local seqCalled=false + local initSZOcount=0 + function P:newNext() + local status,piece + if seqCalled then + status,piece=coroutine.resume(seqGen,P.field,P.stat) + else + status,piece=coroutine.resume(seqGen,P.seqRND,P.gameEnv.seqData) + seqCalled=true end + if status and piece then + if ENV.noInitSZO and initSZOcount<5 then + initSZOcount=initSZOcount+1 + if piece==1 or piece==2 or piece==6 then + return self:newNext() + else + initSZOcount=5 + end + end + P:getNext(piece) + elseif not status then + assert(piece=='cannot resume dead coroutine') + end + end + for _=1,ENV.trueNextCount do P:newNext() end diff --git a/parts/player/player.lua b/parts/player/player.lua index 40380251..2c166a3b 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -613,7 +613,10 @@ do-- function Player:dropPosition(x,y,size) vy=vy+.0626 self:setPosition(x,y,size) if y>2600 then - table.remove(PLAYERS,TABLE.find(PLAYERS,self)) + local index=TABLE.find(PLAYERS,self) + if index then + table.remove(PLAYERS,index) + end return true end end @@ -1433,7 +1436,7 @@ function Player:popNext(ifhold)-- Pop nextQueue to hand if self.nextQueue[1] then self.cur=rem(self.nextQueue,1) - self.newNext() + self:newNext() self.pieceCount=self.pieceCount+1 local pressing=self.keyPressing diff --git a/parts/player/seqGenerators.lua b/parts/player/seqGenerators.lua index c6a8832f..23d49203 100644 --- a/parts/player/seqGenerators.lua +++ b/parts/player/seqGenerators.lua @@ -2,25 +2,20 @@ local ins,rem=table.insert,table.remove local yield=coroutine.yield local seqGenerators={ - none=function() while true do yield() end end, - bag=function(P,seq0) - local rndGen=P.seqRND + none=function() end, + bag=function(rndGen,seq0) local len=#seq0 local bag={} while true do - while #P.nextQueue<10 do - if #bag==0 then - for i=1,len do - bag[i]=seq0[len-i+1] - end + if #bag==0 then + for i=1,len do + bag[i]=seq0[len-i+1] end - P:getNext(rem(bag,rndGen:random(#bag))) end - yield() + yield(rem(bag,rndGen:random(#bag))) end end, - bagES=function(P,seq0) - local rndGen=P.seqRND + bagES=function(rndGen,seq0) local len=#seq0 local bag=TABLE.shift(seq0) do-- Get a good first-bag @@ -40,52 +35,44 @@ local seqGenerators={ end end -- Finish - for i=1,len do P:getNext(bag[i]) end + for i=1,len do yield(bag[i]) end end bag={} while true do - while #P.nextQueue<10 do - if #bag==0 then - for i=1,len do - bag[i]=seq0[len-i+1] - end + if #bag==0 then + for i=1,len do + bag[i]=seq0[len-i+1] end - P:getNext(rem(bag,rndGen:random(#bag))) end - yield() + yield(rem(bag,rndGen:random(#bag))) end end, - his=function(P,seq0) - local rndGen=P.seqRND + his=function(rndGen,seq0) local len=#seq0 local hisLen=math.ceil(len*.5) local history=TABLE.new(0,hisLen) while true do - while #P.nextQueue<10 do - local r - for _=1,hisLen do-- Reroll up to [hisLen] times - r=rndGen:random(len) - local rollAgain - for i=1,hisLen do - if r==history[i] then - rollAgain=true - break-- goto CONTINUE_rollAgain - end + local r + for _=1,hisLen do-- Reroll up to [hisLen] times + r=rndGen:random(len) + local rollAgain + for i=1,hisLen do + if r==history[i] then + rollAgain=true + break-- goto CONTINUE_rollAgain end - if not rollAgain then break end - -- ::CONTINUE_rollAgain:: end - if history[1]~=0 then - P:getNext(seq0[r]) - end - rem(history,1) - ins(history,r) + if not rollAgain then break end + -- ::CONTINUE_rollAgain:: end - yield() + if history[1]~=0 then + yield(seq0[r]) + end + rem(history,1) + ins(history,r) end end, - hisPool=function(P,seq0) - local rndGen=P.seqRND + hisPool=function(rndGen,seq0) local len=#seq0 local hisLen=math.ceil(len*.5) local history=TABLE.new(0,hisLen)-- Indexes of mino-index @@ -126,151 +113,116 @@ local seqGenerators={ end while true do - while #P.nextQueue<10 do - -- print"======================" - -- Pick a mino from pool - local tryTime=0 - local r - repeat-- ::REPEAT_pickAgain:: - local pickAgain - r=_poolPick()-- Random mino-index in pool - for i=1,len do - if r==history[i] then - tryTime=tryTime+1 - if tryTimeweight[maxK] then - maxK=i - end + local maxK=1 + for i=1,len do + weight[i]=weight[i]*.5+rndGen:random() + if weight[i]>weight[maxK] then + maxK=i end - weight[maxK]=weight[maxK]/3.5 - P:getNext(seq0[maxK]) end - yield() + weight[maxK]=weight[maxK]/3.5 + yield(seq0[maxK]) end end, - rnd=function(P,seq0) + rnd=function(rndGen,seq0) if #seq0==1 then local i=seq0[1] while true do - while #P.nextQueue<10 do P:getNext(i) end - yield() + yield(i) end else - local rndGen=P.seqRND local len=#seq0 local last=0 while true do - while #P.nextQueue<10 do - local r=rndGen:random(len-1) - if r>=last then - r=r+1 - end - P:getNext(seq0[r]) - last=r + local r=rndGen:random(len-1) + if r>=last then + r=r+1 end - yield() + yield(seq0[r]) + last=r end end end, - mess=function(P,seq0) - local rndGen=P.seqRND + mess=function(rndGen,seq0) while true do - while #P.nextQueue<10 do - P:getNext(seq0[rndGen:random(#seq0)]) - end - yield() + yield(seq0[rndGen:random(#seq0)]) end end, - reverb=function(P,seq0) - local rndGen=P.seqRND + reverb=function(rndGen,seq0) local bufferSeq,bag={},{} while true do - while #P.nextQueue<10 do - if #bag==0 then - for i=1,#seq0 do bufferSeq[i]=seq0[i] end + if #bag==0 then + for i=1,#seq0 do bufferSeq[i]=seq0[i] end + repeat + local r=rem(bufferSeq,rndGen:random(#bag)) + local p=1 repeat - local r=rem(bufferSeq,rndGen:random(#bag)) - local p=1 - repeat - ins(bag,r) - p=p-.15-rndGen:random() - until p<0 - until #bufferSeq==0 - for i=1,#bag do - bufferSeq[i]=bag[i] - end + ins(bag,r) + p=p-.15-rndGen:random() + until p<0 + until #bufferSeq==0 + for i=1,#bag do + bufferSeq[i]=bag[i] end - P:getNext(rem(bag,rndGen:random(#bag))) end - yield() + yield(rem(bag,rndGen:random(#bag))) end end, - loop=function(P,seq0) + loop=function(rndGen,seq0) local len=#seq0 local bag={} while true do - while #P.nextQueue<10 do - if #bag==0 then - for i=1,len do - bag[i]=seq0[len-i+1] - end + if #bag==0 then + for i=1,len do + bag[i]=seq0[len-i+1] end - P:getNext(rem(bag)) end - yield() + yield(rem(bag)) end end, - fixed=function(P,seq0) - local seq={} + fixed=function(rndGen,seq0) for i=#seq0,1,-1 do - ins(seq,seq0[i]) - end - while true do - while #P.nextQueue<10 do - if seq[1] then - P:getNext(rem(seq)) - else - break - end - end - yield() + yield(seq0[i]) end end, - bagP1inf=function(P,seq0) - local rndGen=P.seqRND + bagP1inf=function(rndGen,seq0) local len=#seq0 local function new() local res={} @@ -331,24 +283,20 @@ local seqGenerators={ end local dist=new() while true do - while #P.nextQueue<10 do - local sum,mydist=dist.next_dist() - local r=rndGen:random(sum) - for i=1,len do - r=r-mydist[i] - if r<=0 then - P:getNext(seq0[i]) - dist.update(i) - break - end + local sum,mydist=dist.next_dist() + local r=rndGen:random(sum) + for i=1,len do + r=r-mydist[i] + if r<=0 then + yield(seq0[i]) + dist.update(i) + break end end - yield() end end, } -return function(P)-- Return a piece-generating function for player P - local s=P.gameEnv.sequence +return function(s)-- Return a piece-generating function for player P if type(s)=='function' then return s elseif type(s)=='string' and seqGenerators[s] then @@ -359,7 +307,6 @@ return function(P)-- Return a piece-generating function for player P "No sequence mode called "..s or "Wrong sequence generator" ) - P.gameEnv.sequence='bag' return seqGenerators.bag end end diff --git a/parts/scenes/custom_sequence.lua b/parts/scenes/custom_sequence.lua index 63ca39c6..dbf2c0e7 100644 --- a/parts/scenes/custom_sequence.lua +++ b/parts/scenes/custom_sequence.lua @@ -174,7 +174,7 @@ scene.widgetList={ WIDGET.newText{name='subTitle',x=530,y=50,lim=170,font=35,align='L',color='H'}, WIDGET.newSelector{name='sequence',x=1080,y=60,w=200,color='Y', - list={'bag','bagES','his','hisPool','c2','rnd','mess','reverb','loop','fixed','bagP1inf'}, + list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb','loop','fixed'}, disp=CUSval('sequence'),code=CUSsto('sequence') }, diff --git a/parts/scenes/dict.lua b/parts/scenes/dict.lua index 43b71106..3c9e51dd 100644 --- a/parts/scenes/dict.lua +++ b/parts/scenes/dict.lua @@ -165,6 +165,9 @@ function scene.update(dt) end end +local function listStencil() + GC.rectangle('fill',20,180,280,526) +end function scene.draw() gc.setColor(COLOR.dX) gc.rectangle('fill',300,180,958,526,5) @@ -189,19 +192,16 @@ function scene.draw() gc.setColor(1,1,1,.4+.05*sin(TIME()*12.6)) gc.rectangle('fill',20,143+35*(selected-scrollPos),280,35) + GC.stencil(listStencil) + GC.setStencilTest('equal',1) setFont(30) for i=1,min(#list,15) do local y=142+35*i i=i+scrollPos local item=list[i] - gc.setColor(COLOR.D) - gc.print(item.title,29,y-1) - gc.print(item.title,29,y+1) - gc.print(item.title,31,y-1) - gc.print(item.title,31,y+1) - gc.setColor(typeColor[item.type]) - gc.print(item.title,30,y) + GC.shadedPrint(item.title,30,y,'left',1,COLOR.D,typeColor[item.type]) end + GC.setStencilTest() if searchWait>0 then local r=TIME()*2