修复CC死后不能正常复活
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
local int=math.floor
|
|
||||||
local AISpeed={60,50,45,35,25,15,9,6,4,3}
|
local AISpeed={60,50,45,35,25,15,9,6,4,3}
|
||||||
return function(type,speedLV,next,hold,node)
|
return function(type,speedLV,next,hold,node)
|
||||||
if type=="CC"then
|
if type=="CC"then
|
||||||
@@ -12,7 +11,7 @@ return function(type,speedLV,next,hold,node)
|
|||||||
elseif type=="9S"then
|
elseif type=="9S"then
|
||||||
return{
|
return{
|
||||||
type="9S",
|
type="9S",
|
||||||
delta=int(AISpeed[speedLV]*.5),
|
delta=math.floor(AISpeed[speedLV]*.5),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
541
parts/player.lua
541
parts/player.lua
@@ -1027,6 +1027,274 @@ local function Pdraw_demo(P)
|
|||||||
end
|
end
|
||||||
--------------------------</Paint>--------------------------
|
--------------------------</Paint>--------------------------
|
||||||
|
|
||||||
|
--------------------------<Lib Func>--------------------------
|
||||||
|
local function pressKey(P,i)
|
||||||
|
P.keyPressing[i]=true
|
||||||
|
P.act[i](P)
|
||||||
|
if P.control then
|
||||||
|
if P.keyRec then
|
||||||
|
ins(P.keyTime,1,game.frame)
|
||||||
|
P.keyTime[11]=nil
|
||||||
|
end
|
||||||
|
P.stat.key=P.stat.key+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function releaseKey(P,i)
|
||||||
|
P.keyPressing[i]=false
|
||||||
|
end
|
||||||
|
local function pressKey_Rec(P,i)
|
||||||
|
if game.recording then
|
||||||
|
ins(game.rec,game.frame)
|
||||||
|
ins(game.rec,i)
|
||||||
|
end
|
||||||
|
P.keyPressing[i]=true
|
||||||
|
P.act[i](P)
|
||||||
|
if P.control then
|
||||||
|
if P.keyRec then
|
||||||
|
ins(P.keyTime,1,game.frame)
|
||||||
|
P.keyTime[11]=nil
|
||||||
|
end
|
||||||
|
P.stat.key=P.stat.key+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function releaseKey_Rec(P,i)
|
||||||
|
if game.recording then
|
||||||
|
ins(game.rec,game.frame)
|
||||||
|
ins(game.rec,-i)
|
||||||
|
end
|
||||||
|
P.keyPressing[i]=false
|
||||||
|
end
|
||||||
|
local function without(L,e)
|
||||||
|
for i=1,#L do
|
||||||
|
if L[i]==e then return end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
local function getNewStatTable()
|
||||||
|
local T={
|
||||||
|
time=0,score=0,
|
||||||
|
key=0,rotate=0,hold=0,
|
||||||
|
extraPiece=0,extraRate=0,
|
||||||
|
piece=0,row=0,dig=0,
|
||||||
|
atk=0,digatk=0,
|
||||||
|
send=0,recv=0,pend=0,off=0,
|
||||||
|
clear={},clears={},spin={},spins={},
|
||||||
|
pc=0,hpc=0,b2b=0,b3b=0,
|
||||||
|
}
|
||||||
|
for i=1,25 do
|
||||||
|
T.clear[i]={0,0,0,0,0}
|
||||||
|
T.spin[i]={0,0,0,0,0}
|
||||||
|
T.clears[i]=0
|
||||||
|
T.spins[i]=0
|
||||||
|
end
|
||||||
|
return T
|
||||||
|
end
|
||||||
|
local function newEmptyPlayer(id,x,y,size)
|
||||||
|
local P={id=id}
|
||||||
|
players[id]=P
|
||||||
|
players.alive[id]=P
|
||||||
|
|
||||||
|
--Inherit functions of player class
|
||||||
|
for k,v in next,player do P[k]=v end
|
||||||
|
if P.id==1 and game.recording then
|
||||||
|
P.pressKey=pressKey_Rec
|
||||||
|
P.releaseKey=releaseKey_Rec
|
||||||
|
else
|
||||||
|
P.pressKey=pressKey
|
||||||
|
P.releaseKey=releaseKey
|
||||||
|
end
|
||||||
|
P.update=Pupdate_alive
|
||||||
|
|
||||||
|
P.fieldOff={x=0,y=0,vx=0,vy=0}--For shake FX
|
||||||
|
P.x,P.y,P.size=x,y,size or 1
|
||||||
|
P.frameColor=frameColor[0]
|
||||||
|
|
||||||
|
P.small=P.size<.1--If draw in small mode
|
||||||
|
if P.small then
|
||||||
|
P.centerX,P.centerY=P.x+300*P.size,P.y+600*P.size
|
||||||
|
P.canvas=love.graphics.newCanvas(60,120)
|
||||||
|
P.frameWait=rnd(30,120)
|
||||||
|
P.draw=Pdraw_small
|
||||||
|
else
|
||||||
|
P.keyRec=true--If calculate keySpeed
|
||||||
|
P.centerX,P.centerY=P.x+300*P.size,P.y+370*P.size
|
||||||
|
P.absFieldX=P.x+150*P.size
|
||||||
|
P.absFieldY=P.y+60*P.size
|
||||||
|
P.draw=Pdraw_norm
|
||||||
|
P.bonus={}--Text objects
|
||||||
|
end
|
||||||
|
P.randGen=mt.newRandomGenerator(game.seed)
|
||||||
|
|
||||||
|
P.small=false
|
||||||
|
P.alive=true
|
||||||
|
P.control=false
|
||||||
|
P.timing=false
|
||||||
|
P.stat=getNewStatTable()
|
||||||
|
|
||||||
|
P.modeData={point=0,event=0,counter=0}--Data use by mode
|
||||||
|
P.keyTime={}P.keySpeed=0
|
||||||
|
P.dropTime={}P.dropSpeed=0
|
||||||
|
for i=1,10 do P.keyTime[i]=-1e5 end
|
||||||
|
for i=1,10 do P.dropTime[i]=-1e5 end
|
||||||
|
|
||||||
|
P.field,P.visTime={},{}
|
||||||
|
P.atkBuffer={sum=0}
|
||||||
|
|
||||||
|
--Royale-related
|
||||||
|
P.badge,P.strength=0,0
|
||||||
|
P.atkMode,P.swappingAtkMode=1,20
|
||||||
|
P.atker,P.atking,P.lastRecv={}
|
||||||
|
|
||||||
|
P.dropDelay,P.lockDelay=0,0
|
||||||
|
P.color={}
|
||||||
|
P.showTime=nil
|
||||||
|
P.keepVisible=true
|
||||||
|
|
||||||
|
--P.cur={bk=matrix[2], id=shapeID, color=colorID, name=nameID}
|
||||||
|
--P.sc,P.dir={0,0},0--SpinCenterCoord, direction
|
||||||
|
--P.r,P.c=0,0--row, col
|
||||||
|
--P.hd={...},same as P.cur
|
||||||
|
-- P.curX,P.curY,P.imgY,P.minY=0,0,0,0--x,y,ghostY
|
||||||
|
P.holded=false
|
||||||
|
P.next={}
|
||||||
|
|
||||||
|
P.freshTime=0
|
||||||
|
P.spinLast,P.lastClear=false,nil
|
||||||
|
P.spinSeq=0--For Ospin, each digit mean a spin
|
||||||
|
P.ctrlCount=0--Key press time, for finesse check
|
||||||
|
P.pieceCount=0--Count pieces from next, for drawing bagline
|
||||||
|
|
||||||
|
P.human=false
|
||||||
|
P.RS=kickList.TRS
|
||||||
|
|
||||||
|
-- P.newNext=nil--Call prepareSequence()to get a function to get new next
|
||||||
|
|
||||||
|
P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
|
||||||
|
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
|
||||||
|
P.waiting,P.falling=-1,-1
|
||||||
|
P.clearingRow,P.clearedRow={},{}--Clearing animation height,cleared row mark
|
||||||
|
P.combo,P.b2b=0,0
|
||||||
|
P.garbageBeneath=0
|
||||||
|
P.fieldBeneath=0
|
||||||
|
|
||||||
|
P.score1,P.b2b1=0,0
|
||||||
|
P.dropFX,P.moveFX,P.lockFX,P.clearFX={},{},{},{}
|
||||||
|
P.tasks={}--Tasks
|
||||||
|
P.bonus={}--Texts
|
||||||
|
|
||||||
|
P.endCounter=0--Used after gameover
|
||||||
|
P.result=nil--String:"WIN"/"K.O."
|
||||||
|
|
||||||
|
return P
|
||||||
|
end
|
||||||
|
local function loadGameEnv(P)--Load gameEnv
|
||||||
|
P.gameEnv={}--Current game setting environment
|
||||||
|
local ENV=P.gameEnv
|
||||||
|
local E
|
||||||
|
--Load game settings
|
||||||
|
for k,v in next,gameEnv0 do
|
||||||
|
if modeEnv[k]~=nil then
|
||||||
|
v=modeEnv[k] --Mode setting
|
||||||
|
-- DBP("mode-"..k..":"..tostring(v))
|
||||||
|
elseif game.setting[k]~=nil then
|
||||||
|
v=game.setting[k] --Game setting
|
||||||
|
-- DBP("game-"..k..":"..tostring(v))
|
||||||
|
elseif setting[k]~=nil then
|
||||||
|
v=setting[k] --Global setting
|
||||||
|
-- DBP("global-"..k..":"..tostring(v))
|
||||||
|
-- else
|
||||||
|
-- DBP("default-"..k..":"..tostring(v))
|
||||||
|
end
|
||||||
|
ENV[k]=v --Default setting
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function applyGameEnv(P)--Finish gameEnv processing
|
||||||
|
local ENV=P.gameEnv
|
||||||
|
|
||||||
|
P.dropDelay=ENV.drop
|
||||||
|
P.lockDelay=ENV.lock
|
||||||
|
|
||||||
|
P.color={}
|
||||||
|
for _=1,7 do
|
||||||
|
P.color[_]=SKIN.libColor[ENV.skin[_]]
|
||||||
|
end
|
||||||
|
|
||||||
|
P.keepVisible=ENV.visible=="show"
|
||||||
|
P.showTime=
|
||||||
|
ENV.visible=="show"and 1e99 or
|
||||||
|
ENV.visible=="time"and 300 or
|
||||||
|
ENV.visible=="fast"and 20 or
|
||||||
|
ENV.visible=="none"and 0
|
||||||
|
|
||||||
|
P.life=ENV.life
|
||||||
|
|
||||||
|
ENV.das=max(ENV.das,ENV.mindas)
|
||||||
|
ENV.arr=max(ENV.arr,ENV.minarr)
|
||||||
|
ENV.sdarr=max(ENV.sdarr,ENV.minsdarr)
|
||||||
|
ENV.next=min(ENV.next,setting.maxNext)
|
||||||
|
|
||||||
|
if ENV.sequence~="bag"and ENV.sequence~="loop"then
|
||||||
|
ENV.bagLine=false
|
||||||
|
else
|
||||||
|
ENV.bagLen=#ENV.bag
|
||||||
|
end
|
||||||
|
|
||||||
|
if ENV.lockFX==0 then ENV.lockFX=nil end
|
||||||
|
if ENV.dropFX==0 then ENV.dropFX=nil end
|
||||||
|
if ENV.moveFX==0 then ENV.moveFX=nil end
|
||||||
|
if ENV.clearFX==0 then ENV.clearFX=nil end
|
||||||
|
if ENV.shakeFX==0 then ENV.shakeFX=nil end
|
||||||
|
if ENV.ghost==0 then ENV.ghost=nil end
|
||||||
|
if ENV.center==0 then ENV.center=nil end
|
||||||
|
end
|
||||||
|
local function prepareSequence(P)--Call freshPrepare and set newNext
|
||||||
|
local ENV=P.gameEnv
|
||||||
|
if type(ENV.sequence)=="string"then
|
||||||
|
freshPrepare[ENV.sequence](P)
|
||||||
|
P.newNext=freshMethod[ENV.sequence]
|
||||||
|
else
|
||||||
|
assert(type(ENV.sequence)=="function"and type(ENV.freshMethod)=="function","wrong sequence generator code")
|
||||||
|
ENV.sequence(P)
|
||||||
|
P.newNext=ENV.freshMethod
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function loadAI(P,AIdata)--Load AI params
|
||||||
|
local ENV=P.gameEnv
|
||||||
|
P.AI_mode=AIdata.type
|
||||||
|
P.AI_stage=1
|
||||||
|
P.AI_keys={}
|
||||||
|
P.AI_delay=AIdata.delay or min(int(ENV.drop*.8),2*AIdata.delta)
|
||||||
|
P.AI_delay0=AIdata.delta
|
||||||
|
P.AIdata={
|
||||||
|
type=AIdata.type,
|
||||||
|
delay=AIdata.delay,
|
||||||
|
delta=AIdata.delta,
|
||||||
|
|
||||||
|
next=AIdata.next,
|
||||||
|
hold=AIdata.hold,
|
||||||
|
_20G=ENV._20G,
|
||||||
|
bag=AIdata.bag,
|
||||||
|
node=AIdata.node,
|
||||||
|
}
|
||||||
|
if not BOT then P.AI_mode="9S"end
|
||||||
|
if P.AI_mode=="CC"then
|
||||||
|
P.RS=kickList.AIRS
|
||||||
|
local opt,wei=BOT.getConf()
|
||||||
|
BOT.setHold(opt,P.AIdata.hold)
|
||||||
|
BOT.set20G(opt,P.AIdata._20G)
|
||||||
|
BOT.setBag(opt,P.AIdata.bag=="bag")
|
||||||
|
BOT.setNode(opt,P.AIdata.node)
|
||||||
|
P.AI_bot=BOT.new(opt,wei)
|
||||||
|
BOT.free(opt)BOT.free(wei)
|
||||||
|
for i=1,AIdata.next do
|
||||||
|
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
|
||||||
|
end
|
||||||
|
elseif P.AI_mode=="9S"then
|
||||||
|
P.RS=kickList.TRS
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--------------------------</Lib Func>--------------------------
|
||||||
|
|
||||||
--------------------------<FX>--------------------------
|
--------------------------<FX>--------------------------
|
||||||
function player.showText(P,text,dx,dy,font,style,spd,stop)
|
function player.showText(P,text,dx,dy,font,style,spd,stop)
|
||||||
if P.gameEnv.text then
|
if P.gameEnv.text then
|
||||||
@@ -1036,12 +1304,6 @@ end
|
|||||||
function player.showTextF(P,text,dx,dy,font,style,spd,stop)
|
function player.showTextF(P,text,dx,dy,font,style,spd,stop)
|
||||||
ins(P.bonus,TEXT.getText(text,150+dx,300+dy,font*P.size,style,spd,stop))
|
ins(P.bonus,TEXT.getText(text,150+dx,300+dy,font*P.size,style,spd,stop))
|
||||||
end
|
end
|
||||||
local function without(L,e)
|
|
||||||
for i=1,#L do
|
|
||||||
if L[i]==e then return end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
function player.createLockFX(P)
|
function player.createLockFX(P)
|
||||||
local BK=P.cur.bk
|
local BK=P.cur.bk
|
||||||
local t=12-P.gameEnv.lockFX*2
|
local t=12-P.gameEnv.lockFX*2
|
||||||
@@ -1166,25 +1428,6 @@ function player.RND(P,a,b)
|
|||||||
return R:random(a,b)
|
return R:random(a,b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function getNewStatTable()
|
|
||||||
local T={
|
|
||||||
time=0,score=0,
|
|
||||||
key=0,rotate=0,hold=0,
|
|
||||||
extraPiece=0,extraRate=0,
|
|
||||||
piece=0,row=0,dig=0,
|
|
||||||
atk=0,digatk=0,
|
|
||||||
send=0,recv=0,pend=0,off=0,
|
|
||||||
clear={},clears={},spin={},spins={},
|
|
||||||
pc=0,hpc=0,b2b=0,b3b=0,
|
|
||||||
}
|
|
||||||
for i=1,25 do
|
|
||||||
T.clear[i]={0,0,0,0,0}
|
|
||||||
T.spin[i]={0,0,0,0,0}
|
|
||||||
T.clears[i]=0
|
|
||||||
T.spins[i]=0
|
|
||||||
end
|
|
||||||
return T
|
|
||||||
end
|
|
||||||
function player.solid(P,x,y)
|
function player.solid(P,x,y)
|
||||||
if x<1 or x>10 or y<1 then return true end
|
if x<1 or x>10 or y<1 then return true end
|
||||||
if y>#P.field then return false end
|
if y>#P.field then return false end
|
||||||
@@ -2108,46 +2351,6 @@ function player.drop(P)--Place piece
|
|||||||
end
|
end
|
||||||
--------------------------</Methods>--------------------------
|
--------------------------</Methods>--------------------------
|
||||||
|
|
||||||
--------------------------<Abstract Methods>--------------------------
|
|
||||||
local AM={}
|
|
||||||
function AM.pressKey(P,i)
|
|
||||||
P.keyPressing[i]=true
|
|
||||||
P.act[i](P)
|
|
||||||
if P.control then
|
|
||||||
if P.keyRec then
|
|
||||||
ins(P.keyTime,1,game.frame)
|
|
||||||
P.keyTime[11]=nil
|
|
||||||
end
|
|
||||||
P.stat.key=P.stat.key+1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function AM.releaseKey(P,i)
|
|
||||||
P.keyPressing[i]=false
|
|
||||||
end
|
|
||||||
function AM.pressKey_Rec(P,i)
|
|
||||||
if game.recording then
|
|
||||||
ins(game.rec,game.frame)
|
|
||||||
ins(game.rec,i)
|
|
||||||
end
|
|
||||||
P.keyPressing[i]=true
|
|
||||||
P.act[i](P)
|
|
||||||
if P.control then
|
|
||||||
if P.keyRec then
|
|
||||||
ins(P.keyTime,1,game.frame)
|
|
||||||
P.keyTime[11]=nil
|
|
||||||
end
|
|
||||||
P.stat.key=P.stat.key+1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function AM.releaseKey_Rec(P,i)
|
|
||||||
if game.recording then
|
|
||||||
ins(game.rec,game.frame)
|
|
||||||
ins(game.rec,-i)
|
|
||||||
end
|
|
||||||
P.keyPressing[i]=false
|
|
||||||
end
|
|
||||||
--------------------------</Abstract Methods>--------------------------
|
|
||||||
|
|
||||||
--------------------------<Events>--------------------------
|
--------------------------<Events>--------------------------
|
||||||
local function gameOver()--Save record
|
local function gameOver()--Save record
|
||||||
if game.replaying then return end
|
if game.replaying then return end
|
||||||
@@ -2253,10 +2456,13 @@ function player.lose(P)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if P.AI_mode=="CC"then
|
if P.AI_mode=="CC"then
|
||||||
CC_updateField(P)
|
P.hd=nil
|
||||||
|
loadAI(P,P.AIdata)
|
||||||
|
P:popNext()
|
||||||
end
|
end
|
||||||
|
|
||||||
P.life=P.life-1
|
P.life=P.life-1
|
||||||
|
P.fieldBeneath=0
|
||||||
P.b2b=0
|
P.b2b=0
|
||||||
for i=1,#P.atkBuffer do
|
for i=1,#P.atkBuffer do
|
||||||
local A=P.atkBuffer[i]
|
local A=P.atkBuffer[i]
|
||||||
@@ -2272,7 +2478,7 @@ function player.lose(P)
|
|||||||
end
|
end
|
||||||
sysFX.newShade(.5,1,1,1,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
|
sysFX.newShade(.5,1,1,1,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
|
||||||
sysFX.newRectRipple(.3,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
|
sysFX.newRectRipple(.3,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
|
||||||
sysFX.newRipple(.3,P.x+(300+25+25*P.life+12)*P.size,P.y+(595+12)*P.size,20)
|
sysFX.newRipple(.3,P.x+(450+25+25*P.life+12)*P.size,P.y+(665+12)*P.size,20)
|
||||||
--300+25*i,595
|
--300+25*i,595
|
||||||
SFX.play("clear_3")
|
SFX.play("clear_3")
|
||||||
SFX.play("emit")
|
SFX.play("emit")
|
||||||
@@ -2626,207 +2832,6 @@ end
|
|||||||
--------------------------</Control>--------------------------
|
--------------------------</Control>--------------------------
|
||||||
|
|
||||||
--------------------------<Generator>--------------------------
|
--------------------------<Generator>--------------------------
|
||||||
local function newEmptyPlayer(id,x,y,size)
|
|
||||||
local P={id=id}
|
|
||||||
players[id]=P
|
|
||||||
players.alive[id]=P
|
|
||||||
|
|
||||||
--Inherit functions of player class
|
|
||||||
for k,v in next,player do P[k]=v end
|
|
||||||
if P.id==1 and game.recording then
|
|
||||||
P.pressKey=AM.pressKey_Rec
|
|
||||||
P.releaseKey=AM.releaseKey_Rec
|
|
||||||
else
|
|
||||||
P.pressKey=AM.pressKey
|
|
||||||
P.releaseKey=AM.releaseKey
|
|
||||||
end
|
|
||||||
P.update=Pupdate_alive
|
|
||||||
|
|
||||||
P.fieldOff={x=0,y=0,vx=0,vy=0}--For shake FX
|
|
||||||
P.x,P.y,P.size=x,y,size or 1
|
|
||||||
P.frameColor=frameColor[0]
|
|
||||||
|
|
||||||
P.small=P.size<.1--If draw in small mode
|
|
||||||
if P.small then
|
|
||||||
P.centerX,P.centerY=P.x+300*P.size,P.y+600*P.size
|
|
||||||
P.canvas=love.graphics.newCanvas(60,120)
|
|
||||||
P.frameWait=rnd(30,120)
|
|
||||||
P.draw=Pdraw_small
|
|
||||||
else
|
|
||||||
P.keyRec=true--If calculate keySpeed
|
|
||||||
P.centerX,P.centerY=P.x+300*P.size,P.y+370*P.size
|
|
||||||
P.absFieldX=P.x+150*P.size
|
|
||||||
P.absFieldY=P.y+60*P.size
|
|
||||||
P.draw=Pdraw_norm
|
|
||||||
P.bonus={}--Text objects
|
|
||||||
end
|
|
||||||
P.randGen=mt.newRandomGenerator(game.seed)
|
|
||||||
|
|
||||||
P.small=false
|
|
||||||
P.alive=true
|
|
||||||
P.control=false
|
|
||||||
P.timing=false
|
|
||||||
P.stat=getNewStatTable()
|
|
||||||
|
|
||||||
P.modeData={point=0,event=0,counter=0}--Data use by mode
|
|
||||||
P.keyTime={}P.keySpeed=0
|
|
||||||
P.dropTime={}P.dropSpeed=0
|
|
||||||
for i=1,10 do P.keyTime[i]=-1e5 end
|
|
||||||
for i=1,10 do P.dropTime[i]=-1e5 end
|
|
||||||
|
|
||||||
P.field,P.visTime={},{}
|
|
||||||
P.atkBuffer={sum=0}
|
|
||||||
|
|
||||||
--Royale-related
|
|
||||||
P.badge,P.strength=0,0
|
|
||||||
P.atkMode,P.swappingAtkMode=1,20
|
|
||||||
P.atker,P.atking,P.lastRecv={}
|
|
||||||
|
|
||||||
P.dropDelay,P.lockDelay=0,0
|
|
||||||
P.color={}
|
|
||||||
P.showTime=nil
|
|
||||||
P.keepVisible=true
|
|
||||||
|
|
||||||
--P.cur={bk=matrix[2], id=shapeID, color=colorID, name=nameID}
|
|
||||||
--P.sc,P.dir={0,0},0--SpinCenterCoord, direction
|
|
||||||
--P.r,P.c=0,0--row, col
|
|
||||||
--P.hd={...},same as P.cur
|
|
||||||
-- P.curX,P.curY,P.imgY,P.minY=0,0,0,0--x,y,ghostY
|
|
||||||
P.holded=false
|
|
||||||
P.next={}
|
|
||||||
|
|
||||||
P.freshTime=0
|
|
||||||
P.spinLast,P.lastClear=false,nil
|
|
||||||
P.spinSeq=0--For Ospin, each digit mean a spin
|
|
||||||
P.ctrlCount=0--Key press time, for finesse check
|
|
||||||
P.pieceCount=0--Count pieces from next, for drawing bagline
|
|
||||||
|
|
||||||
P.human=false
|
|
||||||
P.RS=kickList.TRS
|
|
||||||
|
|
||||||
-- P.newNext=nil--Call prepareSequence()to get a function to get new next
|
|
||||||
|
|
||||||
P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
|
|
||||||
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
|
|
||||||
P.waiting,P.falling=-1,-1
|
|
||||||
P.clearingRow,P.clearedRow={},{}--Clearing animation height,cleared row mark
|
|
||||||
P.combo,P.b2b=0,0
|
|
||||||
P.garbageBeneath=0
|
|
||||||
P.fieldBeneath=0
|
|
||||||
|
|
||||||
P.score1,P.b2b1=0,0
|
|
||||||
P.dropFX,P.moveFX,P.lockFX,P.clearFX={},{},{},{}
|
|
||||||
P.tasks={}--Tasks
|
|
||||||
P.bonus={}--Texts
|
|
||||||
|
|
||||||
P.endCounter=0--Used after gameover
|
|
||||||
P.result=nil--String:"WIN"/"K.O."
|
|
||||||
|
|
||||||
return P
|
|
||||||
end
|
|
||||||
local function loadGameEnv(P)--Load gameEnv
|
|
||||||
P.gameEnv={}--Current game setting environment
|
|
||||||
local ENV=P.gameEnv
|
|
||||||
local E
|
|
||||||
--Load game settings
|
|
||||||
for k,v in next,gameEnv0 do
|
|
||||||
if modeEnv[k]~=nil then
|
|
||||||
v=modeEnv[k] --Mode setting
|
|
||||||
-- DBP("mode-"..k..":"..tostring(v))
|
|
||||||
elseif game.setting[k]~=nil then
|
|
||||||
v=game.setting[k] --Game setting
|
|
||||||
-- DBP("game-"..k..":"..tostring(v))
|
|
||||||
elseif setting[k]~=nil then
|
|
||||||
v=setting[k] --Global setting
|
|
||||||
-- DBP("global-"..k..":"..tostring(v))
|
|
||||||
-- else
|
|
||||||
-- DBP("default-"..k..":"..tostring(v))
|
|
||||||
end
|
|
||||||
ENV[k]=v --Default setting
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local function applyGameEnv(P)--Finish gameEnv processing
|
|
||||||
local ENV=P.gameEnv
|
|
||||||
|
|
||||||
P.dropDelay=ENV.drop
|
|
||||||
P.lockDelay=ENV.lock
|
|
||||||
|
|
||||||
P.color={}
|
|
||||||
for _=1,7 do
|
|
||||||
P.color[_]=SKIN.libColor[ENV.skin[_]]
|
|
||||||
end
|
|
||||||
|
|
||||||
P.keepVisible=ENV.visible=="show"
|
|
||||||
P.showTime=
|
|
||||||
ENV.visible=="show"and 1e99 or
|
|
||||||
ENV.visible=="time"and 300 or
|
|
||||||
ENV.visible=="fast"and 20 or
|
|
||||||
ENV.visible=="none"and 0
|
|
||||||
|
|
||||||
P.life=ENV.life
|
|
||||||
|
|
||||||
ENV.das=max(ENV.das,ENV.mindas)
|
|
||||||
ENV.arr=max(ENV.arr,ENV.minarr)
|
|
||||||
ENV.sdarr=max(ENV.sdarr,ENV.minsdarr)
|
|
||||||
ENV.next=min(ENV.next,setting.maxNext)
|
|
||||||
|
|
||||||
if ENV.sequence~="bag"and ENV.sequence~="loop"then
|
|
||||||
ENV.bagLine=false
|
|
||||||
else
|
|
||||||
ENV.bagLen=#ENV.bag
|
|
||||||
end
|
|
||||||
|
|
||||||
if ENV.lockFX==0 then ENV.lockFX=nil end
|
|
||||||
if ENV.dropFX==0 then ENV.dropFX=nil end
|
|
||||||
if ENV.moveFX==0 then ENV.moveFX=nil end
|
|
||||||
if ENV.clearFX==0 then ENV.clearFX=nil end
|
|
||||||
if ENV.shakeFX==0 then ENV.shakeFX=nil end
|
|
||||||
if ENV.ghost==0 then ENV.ghost=nil end
|
|
||||||
if ENV.center==0 then ENV.center=nil end
|
|
||||||
end
|
|
||||||
local function prepareSequence(P)--Call freshPrepare and set newNext
|
|
||||||
local ENV=P.gameEnv
|
|
||||||
if type(ENV.sequence)=="string"then
|
|
||||||
freshPrepare[ENV.sequence](P)
|
|
||||||
P.newNext=freshMethod[ENV.sequence]
|
|
||||||
else
|
|
||||||
assert(type(ENV.sequence)=="function"and type(ENV.freshMethod)=="function","wrong sequence generator code")
|
|
||||||
ENV.sequence(P)
|
|
||||||
P.newNext=ENV.freshMethod
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local function loadAI(P,AIdata)--Load AI params
|
|
||||||
local ENV=P.gameEnv
|
|
||||||
P.AI_mode=AIdata.type
|
|
||||||
P.AI_stage=1
|
|
||||||
P.AI_keys={}
|
|
||||||
P.AI_delay=AIdata.delay or min(int(ENV.drop*.8),2*AIdata.delta)
|
|
||||||
P.AI_delay0=AIdata.delta
|
|
||||||
P.AIdata={
|
|
||||||
next=AIdata.next,
|
|
||||||
hold=AIdata.hold,
|
|
||||||
_20G=ENV._20G,
|
|
||||||
bag=AIdata.bag=="bag",
|
|
||||||
node=AIdata.node,
|
|
||||||
}
|
|
||||||
if not BOT then P.AI_mode="9S"end
|
|
||||||
if P.AI_mode=="CC"then
|
|
||||||
P.RS=kickList.AIRS
|
|
||||||
local opt,wei=BOT.getConf()
|
|
||||||
BOT.setHold(opt,P.AIdata.hold)
|
|
||||||
BOT.set20G(opt,P.AIdata._20G)
|
|
||||||
BOT.setBag(opt,P.AIdata.bag)
|
|
||||||
BOT.setNode(opt,P.AIdata.node)
|
|
||||||
P.AI_bot=BOT.new(opt,wei)
|
|
||||||
BOT.free(opt)BOT.free(wei)
|
|
||||||
for i=1,AIdata.next do
|
|
||||||
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
|
|
||||||
end
|
|
||||||
elseif P.AI_mode=="9S"then
|
|
||||||
P.RS=kickList.TRS
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function PLY.newDemoPlayer(id,x,y,size)
|
function PLY.newDemoPlayer(id,x,y,size)
|
||||||
local P=newEmptyPlayer(id,x,y,size)
|
local P=newEmptyPlayer(id,x,y,size)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user