diff --git a/parts/bot/bot_cc.lua b/parts/bot/bot_cc.lua index e05111f2..cf324137 100644 --- a/parts/bot/bot_cc.lua +++ b/parts/bot/bot_cc.lua @@ -7,18 +7,36 @@ local pcall=pcall local ins,rem=table.insert,table.remove local yield=coroutine.yield local bot_cc={} -function bot_cc:checkDest() +function bot_cc:checkDest(b2b,atk,exblock,yomi) local dest=self.P.destFX if not dest then return end + if not (dest.b2b==b2b and dest.attack==atk and dest.extra==exblock) then + print('hope: '..dest.b2b..' '..dest.attack..' '..dest.extra) + print('real: '..b2b..' '..atk..' '..exblock) + print(yomi) + self:lockWrongPlace() + self.P.destFX=nil + return + end local CB=self.P.cur.bk for k=1,#dest,2 do local r=CB[dest[k+1]-self.P.curY+2] if not r or not r[dest[k]-self.P.curX+2]then + print('wrong place') self:lockWrongPlace() self.P.destFX=nil return end end + local should_spawn = self.P:getNextSpawn() - 1 + if dest.spawn ~= should_spawn then + assert(dest.spawn > should_spawn) + print('wrong spawn: should be '..dest.spawn..' but '..should_spawn) + print('-- should only happen when camera is going down') + self:lockWrongPlace() + self.P.destFX=nil + return + end end function bot_cc:revive() TABLE.cut(self.P.holdQueue) @@ -37,10 +55,10 @@ function bot_cc:thread() ccBot:think() --Poll keys - local success,result,dest,hold,move + local success,result,dest,hold,move,b2b,attack,extra,spawn repeat yield() - success,result,dest,hold,move=pcall(ccBot.getMove,ccBot) + success,result,dest,hold,move,b2b,attack,extra,spawn=pcall(ccBot.getMove,ccBot) until not success or result==0 or result==2 if not success then break end if result==2 then @@ -50,6 +68,10 @@ function bot_cc:thread() dest[7],dest[8]=dest[2][1],dest[2][2] dest[1],dest[2]=dest[3][1],dest[3][2] dest[3],dest[4]=dest[4][1],dest[4][2] + dest.b2b = b2b + dest.attack = attack + dest.extra = extra + dest.spawn = spawn P.destFX=dest if hold then--Hold keys[1]=8 @@ -82,8 +104,16 @@ function bot_cc:updateField() F[i],i=F0[y][x]>0,i+1 end end while i<=400 do F[i],i=false,i+1 end - if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b>=100,P.combo)then + local y = P:getNextSpawn()-1 + if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b,P.combo,P.stat.pc,P.stat.row,y)then print("CC is dead ("..P.id..")","error") + for y=#F0,1,-1 do + local s="" + for x=1,10 do + s=s..(F[(y-1)*10+x] and "[]" or "..") + end + print(s) + end end end function bot_cc:switch20G() diff --git a/parts/player/player.lua b/parts/player/player.lua index e0f33f0a..e7421661 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -681,7 +681,7 @@ function Player:getHolePos()--Get a good garbage-line hole position end end function Player:garbageRelease()--Check garbage buffer and try to release them - local n,flag=1 + local n=1 while true do local A=self.atkBuffer[n] if A and A.countdown<=0 and not A.sent then @@ -690,14 +690,10 @@ function Player:garbageRelease()--Check garbage buffer and try to release them A.sent,A.time=true,0 self.stat.pend=self.stat.pend+A.amount n=n+1 - flag=true else break end end - if flag and self.bot then - self.bot:updateField() - end end function Player:garbageRise(color,amount,line)--Release n-lines garbage to field local _ @@ -1160,6 +1156,11 @@ function Player:resetBlock()--Reset Block's position and execute I*S end end +function Player:getNextSpawn() + local cur = self.nextQueue[1] + return int(self.gameEnv.fieldH+1-modf(cur.RS.centerPos[cur.id][cur.dir][1]))+ceil(self.fieldBeneath/30) +end + function Player:spin(d,ifpre) local C=self.cur local sc=C.RS.centerPos[C.id][C.dir] @@ -1721,6 +1722,8 @@ do end end + local yomi = "" + piece.spin,piece.mini=dospin,false piece.pc,piece.hpc=false,false piece.special=false @@ -1730,6 +1733,7 @@ do cscore=(spinSCR[C.name]or spinSCR[8])[cc] if self.b2b>800 then self:showText(text.b3b..text.block[C.name]..text.spin.." "..text.clear[cc],0,-30,35,'stretch') + yomi = yomi..text.b3b..text.block[C.name]..text.spin.." "..text.clear[cc] atk=b2bATK[cc]+cc*.5 exblock=exblock+1 cscore=cscore*2 @@ -1739,6 +1743,7 @@ do end elseif self.b2b>=50 then self:showText(text.b2b..text.block[C.name]..text.spin.." "..text.clear[cc],0,-30,35,'spin') + yomi = yomi..text.b2b..text.block[C.name]..text.spin.." "..text.clear[cc] atk=b2bATK[cc] cscore=cscore*1.2 Stat.b2b=Stat.b2b+1 @@ -1747,11 +1752,13 @@ do end else self:showText(text.block[C.name]..text.spin.." "..text.clear[cc],0,-30,45,'spin') + yomi = yomi..text.block[C.name]..text.spin.." "..text.clear[cc] atk=2*cc end sendTime=20+atk*20 if mini then self:showText(text.mini,0,-80,35,'appear') + yomi = text.mini..' '..yomi atk=atk*.25 sendTime=sendTime+60 cscore=cscore*.5 @@ -1772,6 +1779,7 @@ do cscore=clearSCR[cc] if self.b2b>800 then self:showText(text.b3b..text.clear[cc],0,-30,50,'fly') + yomi = text.b3b..text.clear[cc]..yomi atk=4*cc-10 sendTime=100 exblock=exblock+1 @@ -1782,6 +1790,7 @@ do end elseif self.b2b>=50 then self:showText(text.b2b..text.clear[cc],0,-30,50,'drive') + yomi = text.b2b..text.clear[cc]..yomi sendTime=80 atk=3*cc-7 cscore=cscore*1.3 @@ -1791,6 +1800,7 @@ do end else self:showText(text.clear[cc],0,-30,70,'stretch') + yomi = text.clear[cc]..yomi sendTime=60 atk=2*cc-4 end @@ -1798,6 +1808,7 @@ do piece.special=true else self:showText(text.clear[cc],0,-30,35,'appear',(8-cc)*.3) + yomi = text.clear[cc]..yomi atk=cc-.5 sendTime=20+int(atk*20) cscore=cscore+clearSCR[cc] @@ -1816,6 +1827,7 @@ do atk=atk+1 end self:showText(text.cmb[min(cmb,21)],0,25,15+min(cmb,15)*5,cmb<10 and'appear'or'flicker') + yomi = yomi..' '..text.cmb[min(cmb,21)] cscore=cscore+min(50*cmb,500)*(2*cc-1) end @@ -2007,7 +2019,7 @@ do --Check bot things if self.bot then - self.bot:checkDest() + self.bot:checkDest(self.b2b,atk,exblock,yomi) self.bot:updateB2B(self.b2b) self.bot:updateCombo(self.combo) end