Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ecf037f27d | ||
|
|
cf5844a2af | ||
|
|
b2f8abb884 | ||
|
|
128ab01cf0 | ||
|
|
a62945a71d | ||
|
|
9ff8cd3aaa | ||
|
|
b1306ac220 | ||
|
|
57a89c3859 | ||
|
|
610d953803 | ||
|
|
b788f26f50 | ||
|
|
e5f489fbab | ||
|
|
4786ab59b0 | ||
|
|
8c7e2da69a | ||
|
|
f511aa2f6f | ||
|
|
46b119601b | ||
|
|
d4238da156 | ||
|
|
f9cf35f746 | ||
|
|
94519ba147 | ||
|
|
e397bdcd12 | ||
|
|
e8f0efb22c | ||
|
|
7ecadb0ff1 | ||
|
|
097129bd08 | ||
|
|
59377efa0c | ||
|
|
4040afbbd9 | ||
|
|
d362e1cb54 | ||
|
|
ff9647bd00 | ||
|
|
eb2cff0016 | ||
|
|
858f2c673b | ||
|
|
4b9cd0cd06 | ||
|
|
7e2c76bf77 | ||
|
|
4b02f3b9ee | ||
|
|
3f7a09ef71 | ||
|
|
fd580dcadc | ||
|
|
6d64590a12 | ||
|
|
e5be25b481 | ||
|
|
7f28278378 | ||
|
|
a7112094f6 | ||
|
|
37d0a106a9 | ||
|
|
731bdab8b2 | ||
|
|
eabf1242aa | ||
|
|
ef857643c8 | ||
|
|
2cf64541f2 | ||
|
|
b2ba8a84e9 | ||
|
|
78e3aa2532 | ||
|
|
84e253fd8b | ||
|
|
1c4d89c425 | ||
|
|
720e7c6c06 | ||
|
|
e8902d578a | ||
|
|
e70b6d3218 | ||
|
|
dded42aeef | ||
|
|
6cccf2604c | ||
|
|
c72dedf7cf | ||
|
|
f26888beaa | ||
|
|
ce4ba0cefd | ||
|
|
0885f3bfb3 | ||
|
|
becc092192 | ||
|
|
185862eabf | ||
|
|
19ce62997b | ||
|
|
d8c096b06b | ||
|
|
aa836c7028 | ||
|
|
e5e378fa07 | ||
|
|
230514e34a | ||
|
|
d196d73448 | ||
|
|
cb98a9094a | ||
|
|
ec036037fe | ||
|
|
882769bb71 | ||
|
|
ba43e5e6a7 | ||
|
|
09c56d74bd | ||
|
|
c78630a31e | ||
|
|
5342d4f6d6 | ||
|
|
6641d402c0 | ||
|
|
86ffc4a207 | ||
|
|
71130bbced | ||
|
|
17d670a1ba |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
lib
|
||||
@@ -1,6 +1,7 @@
|
||||
local gc=love.graphics
|
||||
local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs
|
||||
local max,min,sin,cos=math.max,math.min,math.sin,math.cos
|
||||
local ins,rem=table.insert,table.remove
|
||||
|
||||
local BG
|
||||
local scr=scr
|
||||
@@ -58,13 +59,158 @@ back.flink={
|
||||
end
|
||||
end,
|
||||
}--Flash after random time
|
||||
|
||||
local wingColor={
|
||||
{0., .9, .9,.626},
|
||||
{.3, 1., .3,.626},
|
||||
{.9, .9, 0.,.626},
|
||||
{1., .5, 0.,.626},
|
||||
{1., .3, .3,.626},
|
||||
{.5, 0., 1.,.626},
|
||||
{.3, .3, 1.,.626},
|
||||
{0., .9, .9,.626},
|
||||
}
|
||||
back.wing={
|
||||
init=function()
|
||||
gc.setDefaultFilter("linear","linear")
|
||||
bar=gc.newCanvas(41,1)
|
||||
gc.push("transform")
|
||||
gc.origin()
|
||||
gc.setCanvas(bar)
|
||||
for x=0,20 do
|
||||
gc.setColor(1,1,1,x/11)
|
||||
gc.rectangle("fill",x,0,1,1)
|
||||
gc.rectangle("fill",41-x,0,1,1)
|
||||
end
|
||||
gc.setCanvas()
|
||||
gc.pop()
|
||||
BG.resize()
|
||||
end,
|
||||
resize=function()
|
||||
crystal={}
|
||||
W,H=scr.w,scr.h
|
||||
for i=1,16 do
|
||||
crystal[i]={
|
||||
x=i<9 and W*.05*i or W*.05*(28-i),
|
||||
y=H*.1,
|
||||
a=0,
|
||||
va=0,
|
||||
f=i<9 and .012-i*.0005 or .012-(17-i)*.0005
|
||||
}
|
||||
end
|
||||
end,
|
||||
update=function()
|
||||
for i=1,16 do
|
||||
local B=crystal[i]
|
||||
B.a=B.a+B.va
|
||||
B.va=B.va*.986-B.a*B.f
|
||||
end
|
||||
end,
|
||||
draw=function()
|
||||
gc.clear(.06,.06,.06)
|
||||
local sy=H*.8
|
||||
for i=1,8 do
|
||||
gc.setColor(wingColor[i])
|
||||
local B=crystal[i]
|
||||
gc.draw(bar,B.x,B.y,B.a,1,sy,20,0)
|
||||
B=crystal[17-i]
|
||||
gc.draw(bar,B.x,B.y,B.a,1,sy,20,0)
|
||||
end
|
||||
end,
|
||||
event=function(level)
|
||||
for i=1,8 do
|
||||
local B=crystal[i]
|
||||
B.va=B.va+.001*level*(1+rnd())
|
||||
B=crystal[17-i]
|
||||
B.va=B.va-.001*level*(1+rnd())
|
||||
end
|
||||
end,
|
||||
discard=function()
|
||||
bar,crystal=nil
|
||||
end,
|
||||
}--Flandre's wing
|
||||
|
||||
local _
|
||||
back.fan={
|
||||
init=function()
|
||||
fan=_G.title_fan
|
||||
t=0
|
||||
petal={}
|
||||
BG.resize()
|
||||
end,
|
||||
resize=function()
|
||||
CX,CY=scr.w/2,scr.h/2
|
||||
W,H=scr.w,scr.h
|
||||
end,
|
||||
update=function()
|
||||
t=t+1
|
||||
if t%10==0 then
|
||||
ins(petal,{
|
||||
x=scr.w*rnd(),
|
||||
y=0,
|
||||
vy=2+rnd()*2,
|
||||
vx=rnd()*2-.5,
|
||||
rx=4+rnd()*4,
|
||||
ry=4+rnd()*4,
|
||||
})
|
||||
end
|
||||
for i=#petal,1,-1 do
|
||||
local P=petal[i]
|
||||
P.y=P.y+P.vy
|
||||
if P.y>H then
|
||||
rem(petal,i)
|
||||
else
|
||||
P.x=P.x+P.vx
|
||||
P.vx=P.vx+rnd()*.01
|
||||
P.rx=max(min(P.rx+rnd()-.5,10),2)
|
||||
P.ry=max(min(P.ry+rnd()-.5,10),2)
|
||||
end
|
||||
end
|
||||
end,
|
||||
draw=function()
|
||||
gc.push("transform")
|
||||
gc.translate(CX,CY+20*sin(t*.02))
|
||||
gc.scale(scr.k)
|
||||
gc.clear(.1,.1,.1)
|
||||
gc.setLineWidth(320)
|
||||
gc.setColor(.3,.2,.3)
|
||||
gc.arc("line","open",0,420,500,-.8*3.1416,-.2*3.1416)
|
||||
|
||||
gc.setLineWidth(4)
|
||||
gc.setColor(.7,.5,.65)
|
||||
gc.arc("line","open",0,420,660,-.799*3.1416,-.201*3.1416)
|
||||
gc.arc("line","open",0,420,340,-.808*3.1416,-.192*3.1416)
|
||||
gc.line(-281,224,-530,30.5)
|
||||
gc.line(281,224,530,30.5)
|
||||
|
||||
gc.setLineWidth(6)
|
||||
gc.setColor(.55,.5,.6)
|
||||
local F=fan
|
||||
for i=1,8 do
|
||||
gc.polygon("line",F[i])
|
||||
end
|
||||
|
||||
gc.setLineWidth(2)
|
||||
gc.setColor(.6,.3,.5)
|
||||
gc.origin()
|
||||
for i=1,#petal do
|
||||
local P=petal[i]
|
||||
gc.ellipse("fill",P.x,P.y,P.rx,P.ry)
|
||||
end
|
||||
gc.pop()
|
||||
end,
|
||||
discard=function()
|
||||
petal=nil
|
||||
end,
|
||||
}
|
||||
|
||||
back.aura={
|
||||
init=function()
|
||||
t=rnd()*3600
|
||||
BG.resize(scr.w,scr.h)
|
||||
end,
|
||||
resize=function(w,h)
|
||||
SHADER.aura:send("w",w*scr.dpi)
|
||||
SHADER.aura:send("w",scr.W)
|
||||
SHADER.aura:send("h",h*scr.dpi)
|
||||
end,
|
||||
update=function(dt)
|
||||
@@ -77,13 +223,13 @@ back.aura={
|
||||
gc.setShader()
|
||||
end,
|
||||
}--Cool liquid background
|
||||
back.game1={
|
||||
back.bg1={
|
||||
init=function()
|
||||
t=0
|
||||
BG.resize(scr.w)
|
||||
end,
|
||||
resize=function(w)
|
||||
SHADER.gradient1:send("w",w*scr.dpi)
|
||||
SHADER.gradient1:send("w",scr.W)
|
||||
end,
|
||||
update=function(dt)
|
||||
t=t+dt
|
||||
@@ -95,7 +241,7 @@ back.game1={
|
||||
gc.setShader()
|
||||
end,
|
||||
}--Horizonal red-blue gradient
|
||||
back.game2={
|
||||
back.bg2={
|
||||
init=function()
|
||||
t=0
|
||||
BG.resize(nil,scr.h)
|
||||
@@ -113,13 +259,13 @@ back.game2={
|
||||
gc.setShader()
|
||||
end,
|
||||
}--Vertical red-green gradient
|
||||
back.game3={
|
||||
back.rainbow={
|
||||
init=function()
|
||||
t=0
|
||||
BG.resize(scr.w,scr.h)
|
||||
end,
|
||||
resize=function(w,h)
|
||||
SHADER.rgb1:send("w",w*scr.dpi)
|
||||
SHADER.rgb1:send("w",scr.W)
|
||||
SHADER.rgb1:send("h",h*scr.dpi)
|
||||
end,
|
||||
update=function(dt)
|
||||
@@ -132,13 +278,13 @@ back.game3={
|
||||
gc.setShader()
|
||||
end,
|
||||
}--Colorful RGB
|
||||
back.game4={
|
||||
back.rainbow2={
|
||||
init=function()
|
||||
t=0
|
||||
BG.resize(scr.w,scr.h)
|
||||
end,
|
||||
resize=function(w,h)
|
||||
SHADER.rgb2:send("w",w*scr.dpi)
|
||||
SHADER.rgb2:send("w",scr.W)
|
||||
SHADER.rgb2:send("h",h*scr.dpi)
|
||||
end,
|
||||
update=function(dt)
|
||||
@@ -151,7 +297,7 @@ back.game4={
|
||||
gc.setShader()
|
||||
end,
|
||||
}--Blue RGB
|
||||
back.game5={
|
||||
back.lightning={
|
||||
init=function()
|
||||
t=0
|
||||
end,
|
||||
@@ -168,7 +314,7 @@ back.game5={
|
||||
|
||||
local blocks=require("parts/mino")
|
||||
local scs=require("parts/spinCenters")
|
||||
back.game6={
|
||||
back.lightning2={
|
||||
init=function()
|
||||
t=0
|
||||
colorLib=_G.SKIN.libColor
|
||||
@@ -251,7 +397,7 @@ back.space={
|
||||
gc.translate(10,10)
|
||||
end,
|
||||
discard=function()
|
||||
stars={}
|
||||
stars=nil
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -260,8 +406,9 @@ for _,bg in next,back do
|
||||
if not bg.init then bg.init= NULL end setfenv(bg.init ,BGvars)
|
||||
if not bg.resize then bg.resize= NULL end setfenv(bg.resize ,BGvars)
|
||||
if not bg.update then bg.update= NULL end setfenv(bg.update ,BGvars)
|
||||
if not bg.discard then bg.discard=NULL end setfenv(bg.discard ,BGvars)
|
||||
if not bg.draw then bg.draw= NULL end setfenv(bg.draw ,BGvars)
|
||||
if not bg.event then bg.event= NULL end setfenv(bg.event ,BGvars)
|
||||
if not bg.discard then bg.discard=NULL end setfenv(bg.discard ,BGvars)
|
||||
end
|
||||
|
||||
BG={
|
||||
@@ -270,6 +417,11 @@ BG={
|
||||
update=NULL,
|
||||
draw=back.none.draw,
|
||||
}
|
||||
function BG.send(data)
|
||||
if BG.event then
|
||||
BG.event(data)
|
||||
end
|
||||
end
|
||||
function BG.set(bg,data)
|
||||
if bg==BG.cur or not setting.bg then return end
|
||||
if BG.discard then
|
||||
@@ -282,8 +434,9 @@ function BG.set(bg,data)
|
||||
BG.init=bg.init or NULL
|
||||
BG.resize=bg.resize or NULL
|
||||
BG.update=bg.update or NULL
|
||||
BG.discard=bg.discard or NULL
|
||||
BG.draw=bg.draw or NULL
|
||||
BG.event=bg.event or NULL
|
||||
BG.discard=bg.discard or NULL
|
||||
BG.init()
|
||||
end
|
||||
return BG
|
||||
@@ -9,7 +9,7 @@ local color={
|
||||
|
||||
lRed={1,.5,.5},
|
||||
lGreen={.5,1,.5},
|
||||
lBlue={.6,.6,1},
|
||||
lBlue={.6,.7,1},
|
||||
lCyan={.5,1,1},
|
||||
lMagenta={1,.5,1},
|
||||
lYellow={1,1,.5},
|
||||
@@ -32,7 +32,6 @@ local color={
|
||||
pink={1,0,.6},
|
||||
grass={.6,1,0},
|
||||
water={0,1,.6},
|
||||
bronze={.7,.4,0},
|
||||
white={1,1,1},
|
||||
purple={.5,0,1},
|
||||
}
|
||||
|
||||
@@ -170,13 +170,15 @@ function keyDown.calculator(k)
|
||||
end
|
||||
S.sym="="
|
||||
S.reg=false
|
||||
if S.val==626 then
|
||||
if S.val==600+20+6 then
|
||||
S.pass=true
|
||||
elseif S.val==196000+022 then
|
||||
S.pass=true
|
||||
elseif S.val==196022 then
|
||||
marking=nil
|
||||
TEXT.show("\68\69\86\58\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100",640,360,60,"stretch",.6)
|
||||
SFX.play("clear")
|
||||
elseif S.val==72943816 then
|
||||
S.pass=true
|
||||
for name,M in next,Modes do
|
||||
if not modeRanks[name]then
|
||||
modeRanks[name]=M.score and 0 or 6
|
||||
@@ -185,14 +187,27 @@ function keyDown.calculator(k)
|
||||
FILE.saveUnlock()
|
||||
TEXT.show("\68\69\86\58\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
|
||||
SFX.play("clear_2")
|
||||
elseif S.val==137926261379 then
|
||||
SCN.goto("debug")
|
||||
elseif S.val==1379e8+2626e4+1379 then
|
||||
S.pass=true
|
||||
SCN.go("debug")
|
||||
elseif S.val==34494 then
|
||||
error("This is an error testing message.")
|
||||
elseif S.val==114 then
|
||||
S.val=514
|
||||
elseif S.val==114514 then
|
||||
S.reg=1919810
|
||||
S.val=114514
|
||||
elseif S.val==123456789 then
|
||||
S.reg=123456789
|
||||
S.val=987654321
|
||||
end
|
||||
end
|
||||
elseif k=="space"then
|
||||
if S.pass then
|
||||
SCN.goto("load")
|
||||
end
|
||||
elseif k=="escape"then
|
||||
S.val,S.reg,S.sym=0
|
||||
elseif k=="delete"then
|
||||
S.val=0
|
||||
elseif k=="space"and S.pass then
|
||||
SCN.swapTo("intro")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -203,6 +218,8 @@ function keyDown.load(k)
|
||||
elseif k=="s"then
|
||||
marking=nil
|
||||
sceneTemp.skip=true
|
||||
elseif k=="escape"then
|
||||
SCN.back()
|
||||
end
|
||||
end
|
||||
function touchDown.load(id,x,y)
|
||||
@@ -215,8 +232,12 @@ function mouseDown.intro(x,y,k)
|
||||
if k==2 then
|
||||
VOC.play("bye")
|
||||
SCN.back()
|
||||
elseif newVersionLaunch then
|
||||
SCN.push("main","fade")
|
||||
SCN.swapTo("history","fade")
|
||||
TEXT.show(text.newVersion,640,200,30,"fly",.3)
|
||||
else
|
||||
SCN.goto("main")
|
||||
SCN.go("main")
|
||||
end
|
||||
end
|
||||
function touchDown.intro(id,x,y)
|
||||
@@ -339,7 +360,7 @@ function keyDown.mode(key)
|
||||
end
|
||||
elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then
|
||||
if key=="e"then
|
||||
SCN.goto("custom")
|
||||
SCN.go("custom")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -396,7 +417,7 @@ function keyDown.custom(key)
|
||||
BGM.play(customRange.bgm[customSel[sel]])
|
||||
end
|
||||
elseif key=="q"then
|
||||
SCN.goto("sequence")
|
||||
SCN.go("sequence")
|
||||
elseif key=="e"then
|
||||
SCN.swapTo("draw","swipe")
|
||||
elseif #key==1 then
|
||||
@@ -429,8 +450,20 @@ function keyDown.sequence(key)
|
||||
local C=s.cur+1
|
||||
ins(preBag,C,key)
|
||||
s.cur=C
|
||||
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
|
||||
if #preBag>0 then
|
||||
love.system.setClipboardText("Techmino SEQ:"..copySequence())
|
||||
TEXT.show(text.copySuccess,640,225,50,"appear",.5)
|
||||
end
|
||||
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
|
||||
local str=love.system.getClipboardText()
|
||||
local p=string.find(str,":")--ptr*
|
||||
if p then str=string.sub(str,p+1)end
|
||||
if not pasteSequence(str)then
|
||||
TEXT.show(text.dataCorrupted,640,225,45,"flicker",.5)
|
||||
end
|
||||
elseif #key==1 then
|
||||
local i=(kb.isDown("lctrl","lshift","lalt","rctrl","rshift","ralt")and minoKey2 or minoKey)[key]
|
||||
local i=(kb.isDown("lshift","lalt","rshift","ralt")and minoKey2 or minoKey)[key]
|
||||
if i then
|
||||
local C=s.cur+1
|
||||
ins(preBag,C,i)
|
||||
@@ -458,18 +491,6 @@ function keyDown.sequence(key)
|
||||
else
|
||||
sceneTemp.sure=50
|
||||
end
|
||||
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
|
||||
if #preBag>0 then
|
||||
love.system.setClipboardText("Techmino SEQ:"..copySequence())
|
||||
TEXT.show(text.copySuccess,640,225,50,"appear",.5)
|
||||
end
|
||||
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
|
||||
local str=love.system.getClipboardText()
|
||||
local p=string.find(str,":")--ptr*
|
||||
if p then str=string.sub(str,p+1)end
|
||||
if not pasteSequence(str)then
|
||||
TEXT.show(text.dataCorrupted,640,225,45,"flicker",.5)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -685,7 +706,7 @@ function keyDown.pause(key)
|
||||
elseif key=="escape"then
|
||||
resumeGame()
|
||||
elseif key=="s"then
|
||||
SCN.goto("setting_sound")
|
||||
SCN.go("setting_sound")
|
||||
elseif key=="r"then
|
||||
TASK.clear("play")
|
||||
resetGameData()
|
||||
@@ -1069,6 +1090,71 @@ function love.focus(f)
|
||||
pauseGame()
|
||||
end
|
||||
end
|
||||
function love.errorhandler(msg)
|
||||
local PUMP,POLL=love.event.pump,love.event.poll
|
||||
love.mouse.setVisible(true)
|
||||
love.audio.stop()
|
||||
local err={"Error:"..msg}
|
||||
local trace=debug.traceback("",2)
|
||||
local c=2
|
||||
for l in string.gmatch(trace,"(.-)\n")do
|
||||
if c>2 then
|
||||
if not string.find(l,"boot")then
|
||||
err[c]=string.gsub(l,"^\t*","")
|
||||
c=c+1
|
||||
end
|
||||
else
|
||||
err[2]="Traceback"
|
||||
c=3
|
||||
end
|
||||
end
|
||||
print(table.concat(err,"\n"),1,c-2)
|
||||
gc.reset()
|
||||
local CAP
|
||||
local function _(_)CAP=gc.newImage(_)end
|
||||
gc.captureScreenshot(_)
|
||||
gc.present()
|
||||
setting.sfx=setting.voc--only for error "voice" played with voice volume,not saved
|
||||
if SFX.list.error then SFX.play("error",.8)end
|
||||
local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926}
|
||||
local needDraw=true
|
||||
return function()
|
||||
PUMP()
|
||||
for E,a,b,c,d,e in POLL()do
|
||||
if E=="quit"or a=="escape"then
|
||||
destroyPlayers()
|
||||
return 1
|
||||
elseif E=="resize"then
|
||||
love.resize(a,b)
|
||||
needDraw=true
|
||||
elseif E=="focus"then
|
||||
needDraw=true
|
||||
end
|
||||
end
|
||||
if needDraw then
|
||||
gc.discard()
|
||||
gc.clear(BGcolor)
|
||||
gc.setColor(1,1,1)
|
||||
gc.push("transform")
|
||||
gc.replaceTransform(xOy)
|
||||
gc.draw(CAP,100,365,nil,512/CAP:getWidth(),288/CAP:getHeight())
|
||||
setFont(120)gc.print(":(",100,40)
|
||||
setFont(38)gc.printf(text.errorMsg,100,200,1280-100)
|
||||
setFont(20)
|
||||
gc.print(system.."-"..gameVersion,100,660)
|
||||
gc.print("scene:"..SCN.cur,400,660)
|
||||
gc.printf(err[1],626,360,1260-626)
|
||||
gc.print("TRACEBACK",626,426)
|
||||
for i=4,#err-2 do
|
||||
gc.print(err[i],626,370+20*i)
|
||||
end
|
||||
gc.pop()
|
||||
gc.present()
|
||||
needDraw=false
|
||||
end
|
||||
love.timer.sleep(.2)
|
||||
end
|
||||
end
|
||||
local scs={.5,1.5,.5,1.5,.5,1.5,.5,1.5,.5,1.5,1,1,0,2}
|
||||
local devColor={
|
||||
color.white,
|
||||
@@ -1092,7 +1178,7 @@ function love.run()
|
||||
local FCT=0--Framedraw counter
|
||||
|
||||
love.resize(gc.getWidth(),gc.getHeight())
|
||||
SCN.init(setting.lock and "calculator"or"load")--Scene Launch
|
||||
SCN.init("load")--Scene Launch
|
||||
marking=true
|
||||
|
||||
return function()
|
||||
@@ -1162,7 +1248,7 @@ function love.run()
|
||||
|
||||
--Draw scene swapping animation
|
||||
if SCN.swapping then
|
||||
_=SCN.swap
|
||||
_=SCN.stat
|
||||
_.draw(_.time)
|
||||
end
|
||||
|
||||
@@ -1184,8 +1270,8 @@ function love.run()
|
||||
for i=1,#LIST do
|
||||
gc.rectangle("fill",900+2*i,_,2,-LIST[i]*4000)
|
||||
end
|
||||
if devMode==3 then WAIT(.26)
|
||||
elseif devMode==4 then WAIT(.626)
|
||||
if devMode==3 then WAIT(.1)
|
||||
elseif devMode==4 then WAIT(.5)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1197,9 +1283,9 @@ function love.run()
|
||||
if Timer()-lastFreshPow>2 and setting.powerInfo and loadingFinished then
|
||||
updatePowerInfo()
|
||||
lastFreshPow=Timer()
|
||||
_=gc.getWidth()
|
||||
if _~=scr.w then
|
||||
love.resize(_,gc.getHeight())
|
||||
if gc.getWidth()~=scr.w then
|
||||
love.resize(gc.getWidth(),gc.getHeight())
|
||||
TEXT.show("resized",200,100,30,"stretch")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ local langList={
|
||||
stage=function(n)return"关卡 "..n end,
|
||||
great="Great!",
|
||||
awesome="Awesome.",
|
||||
almost="Almost!",
|
||||
continue="Continue.",
|
||||
maxspeed="最高速度",
|
||||
speedup="速度加快",
|
||||
@@ -85,8 +86,6 @@ local langList={
|
||||
unlockSavingError="解锁保存失败:",
|
||||
recSavingError="纪录保存失败:",
|
||||
|
||||
ai_fixed="不能同时开启AI和固定序列",
|
||||
ai_prebag="不能同时开启AI和自定义序列",
|
||||
switchSpawnSFX="请开启方块出生音效",
|
||||
|
||||
needRestart="重新开始以生效",
|
||||
@@ -126,7 +125,7 @@ local langList={
|
||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||
radarData={
|
||||
"D'PM",
|
||||
"OPM",
|
||||
"ADPM",
|
||||
"APM",
|
||||
"SPM",
|
||||
"L'PM",
|
||||
@@ -154,7 +153,7 @@ local langList={
|
||||
"",
|
||||
"使用LOVE2D引擎",
|
||||
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
|
||||
"仅通过内测群1080457319进行免费下载/更新",
|
||||
"仅通过内测群1127702001进行免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
|
||||
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
@@ -163,12 +162,14 @@ local langList={
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
"使用LOVE2D引擎",
|
||||
"",
|
||||
"程序:MrZ, FinnTenzor",
|
||||
"美术:MrZ, (Gnyar)",
|
||||
"音乐:MrZ, (T0722)",
|
||||
"程序: MrZ, FinnTenzor",
|
||||
"美术: MrZ, (Gnyar)",
|
||||
"音乐: MrZ, (T0722)",
|
||||
"音效/语音: MrZ, Miya",
|
||||
"演出: 模电, HBM",
|
||||
"测试:思竣 官网: 渣渣120",
|
||||
"测试: 思竣",
|
||||
"英文文案: User670",
|
||||
"官网: 渣渣120",
|
||||
"",
|
||||
"特别感谢:",
|
||||
"Flyz, Farter, 蕴空之灵,",
|
||||
@@ -184,7 +185,7 @@ local langList={
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
|
||||
WidgetText={
|
||||
calculator={
|
||||
_1="1",_2="2",_3="3",
|
||||
@@ -246,6 +247,7 @@ local langList={
|
||||
back="返回",
|
||||
},
|
||||
draw={
|
||||
b12="[ ]",
|
||||
any="不定",
|
||||
space="×",
|
||||
clear="清除",
|
||||
@@ -277,7 +279,7 @@ local langList={
|
||||
autoPause="失去焦点自动暂停",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
lock="软件锁(密码626)",
|
||||
appLock="软件锁(密码626)",
|
||||
back="返回",
|
||||
},
|
||||
setting_video={
|
||||
@@ -290,6 +292,7 @@ local langList={
|
||||
bagLine="包分界线",
|
||||
lockFX="锁定特效等级",
|
||||
dropFX="下落特效等级",
|
||||
moveFX="移动特效等级",
|
||||
clearFX="消除特效等级",
|
||||
shakeFX="晃动特效等级",
|
||||
atkFX="攻击特效等级",
|
||||
@@ -490,6 +493,7 @@ local langList={
|
||||
stage=function(n)return"关卡 "..n end,
|
||||
great="不错!",
|
||||
awesome="精彩。",
|
||||
almost="差一点!",
|
||||
continue="继续。",
|
||||
maxspeed="最高速度",
|
||||
speedup="速度加快",
|
||||
@@ -555,8 +559,6 @@ local langList={
|
||||
unlockSavingError="解锁保存失败:",
|
||||
recSavingError="纪录保存失败:",
|
||||
|
||||
ai_fixed="不能同时开启电脑玩家和固定序列",
|
||||
ai_prebag="不能同时开启电脑玩家和自定义序列",
|
||||
switchSpawnSFX="请开启方块出生音效",
|
||||
|
||||
needRestart="重新开始以生效",
|
||||
@@ -596,7 +598,7 @@ local langList={
|
||||
radar={"防","守","攻","送","速","挖"},
|
||||
radarData={
|
||||
"防/分",
|
||||
"挡/分",
|
||||
"综/分",
|
||||
"攻/分",
|
||||
"送/分",
|
||||
"行/分",
|
||||
@@ -623,7 +625,7 @@ local langList={
|
||||
"从TO/C2/KOS/TGM3/JS等方块获得过灵感",
|
||||
"",
|
||||
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
|
||||
"仅通过内测群1080457319进行免费下载/更新",
|
||||
"仅通过内测群1127702001进行免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
|
||||
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
@@ -632,13 +634,14 @@ local langList={
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
"使用LOVE2D引擎",
|
||||
"",
|
||||
"程序:MrZ, FinnTenzor",
|
||||
"美术:MrZ, (T0722, Gnyar)",
|
||||
"音乐:MrZ, (T0722)",
|
||||
"程序: MrZ, FinnTenzor",
|
||||
"美术: MrZ, (T0722, Gnyar)",
|
||||
"音乐: MrZ, (T0722)",
|
||||
"音效/语音: MrZ, Miya",
|
||||
"演出: 模电, HBM",
|
||||
"测试:思竣 官网: 渣渣120",
|
||||
"",
|
||||
"测试: 思竣",
|
||||
"英文文案: User670",
|
||||
"官网: 渣渣120",
|
||||
"特别感谢:",
|
||||
"Flyz, Farter, 蕴空之灵,",
|
||||
"茶管, [所有内测人员]",
|
||||
@@ -653,7 +656,7 @@ local langList={
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
|
||||
WidgetText={
|
||||
calculator={
|
||||
_1="1",_2="2",_3="3",
|
||||
@@ -715,6 +718,7 @@ local langList={
|
||||
back="返回",
|
||||
},
|
||||
draw={
|
||||
b12="[ ]",
|
||||
any="不定",
|
||||
space="×",
|
||||
clear="清除",
|
||||
@@ -746,7 +750,7 @@ local langList={
|
||||
autoPause="失去焦点自动暂停",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
lock="软件锁(密码626)",
|
||||
appLock="软件锁(密码626)",
|
||||
back="返回",
|
||||
},
|
||||
setting_video={
|
||||
@@ -759,6 +763,7 @@ local langList={
|
||||
bagLine="包分界线",
|
||||
lockFX="锁定特效等级",
|
||||
dropFX="下落特效等级",
|
||||
moveFX="移动特效等级",
|
||||
clearFX="消除特效等级",
|
||||
shakeFX="晃动特效等级",
|
||||
atkFX="攻击特效等级",
|
||||
@@ -942,28 +947,29 @@ local langList={
|
||||
},
|
||||
{
|
||||
anykey="Press any button",
|
||||
newVersion="Updating detected!",
|
||||
newBigVersion="Big updating detected! Save data altered",
|
||||
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
|
||||
newVersion="Update detected!",
|
||||
newBigVersion="A big update was detected! Save data has been altered.",
|
||||
marking="Game Author: MrZ_26\nIllegal recording if you can see this\nAny explanation is invalid",
|
||||
lang="English",
|
||||
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
||||
royale_remain=function(n)return n.." Players Remaining"end,
|
||||
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
|
||||
block=nil,spin="-spin ",
|
||||
clear={"single","double","triple","Techrash","Techrash+"},
|
||||
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
|
||||
block=nil,spin="-Spin ",
|
||||
clear={"Single","Double","Triple","Techrash","Techrash+"},
|
||||
mini="Mini",b2b="B2B ",b3b="B2B2B ",
|
||||
PC="Perfect Clear",HPC="Clear",
|
||||
hold="Hold",next="Next",
|
||||
replaying="[Replaying]",
|
||||
hold="HOLD",next="NEXT",
|
||||
replaying="[Replay]",
|
||||
|
||||
stage=function(n)return"Stage "..n end,
|
||||
great="Great!",
|
||||
awesome="Awesome!",
|
||||
almost="Almost!",
|
||||
continue="Keep going!",
|
||||
maxspeed="Max speed!",
|
||||
speedup="Speed up!",
|
||||
|
||||
win="Win",
|
||||
win="You Win!",
|
||||
finish="Finish",
|
||||
gameover="Game Over",
|
||||
pause="Pause",
|
||||
@@ -992,47 +998,45 @@ local langList={
|
||||
fall=nil,
|
||||
next=nil,
|
||||
hold={"On","Off","Inf"},
|
||||
sequence={"bag","his4","random","loop","fixed"},
|
||||
visible={"normal","slow fade","fast fade","sudden fade"},
|
||||
sequence={"Bag","His4","Random","Loop","Fixed"},
|
||||
visible={"Normal","Slow Fade","Quick Fade","Sudden Fade"},
|
||||
target={10,20,40,100,200,500,1000,"None"},
|
||||
freshLimit={0,8,15,"Inf"},
|
||||
opponent={"None","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
|
||||
},
|
||||
sequence="Custom Sequence",
|
||||
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
|
||||
setting_game="Game settings",
|
||||
setting_video="Video settings",
|
||||
setting_sound="Sound settings",
|
||||
setting_game="Game Settings",
|
||||
setting_video="Video Settings",
|
||||
setting_sound="Sound Settings",
|
||||
setting_control="Control Settings",
|
||||
setting_skin="Layout Settings",
|
||||
preview="Preview",
|
||||
keyboard="Keyboard",joystick="Controller",
|
||||
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back",
|
||||
ctrlSetHelp="Arrow keys: select/change slot, Enter: Change, Esc: Go back",
|
||||
musicRoom="Music Room",
|
||||
nowPlaying="Now Playing:",
|
||||
page="Page:",
|
||||
|
||||
ai_fixed="AI is incompatible with fixed sequence",
|
||||
ai_prebag="AI is incompatible with custom sequence",
|
||||
ai_fixed="The AI is incompatible with fixed sequences.",
|
||||
ai_prebag="The AI is incompatible with custom sequences.",
|
||||
settingSaved="Settings Saved",
|
||||
settingSavingError="Failed to save settings:",
|
||||
keyMapSaved="Key settings saved",
|
||||
keyMapSavingError="Failed to save key settings:",
|
||||
VKSaved="virtual keys saved",
|
||||
VKSavingError="Failed to save virtual key:",
|
||||
statSavingError="Failed to save stat:",
|
||||
unlockSavingError="Failed to save unlock:",
|
||||
VKSaved="Virtual keys saved",
|
||||
VKSavingError="Failed to save virtual key configuration:",
|
||||
statSavingError="Failed to save statistics:",
|
||||
unlockSavingError="Failed to save unlocked content:",
|
||||
recSavingError="Failed to save record:",
|
||||
|
||||
ai_fixed="AI is incompatible with fixed sequence",
|
||||
ai_prebag="AI is incompatible with custom sequence",
|
||||
switchSpawnSFX="Switch on spawn SFX to play",
|
||||
|
||||
needRestart="Effective after restart",
|
||||
copySuccess="Copied successfully",
|
||||
dataCorrupted="Data corrupted",
|
||||
VKTchW="Touch Weight",
|
||||
VKOrgW="Origion Weight",
|
||||
VKOrgW="Origin Weight",
|
||||
VKCurW="Cur. Pos. Weight",
|
||||
noScore="No Scores Yet",
|
||||
highScore="Personal Bests",
|
||||
@@ -1062,7 +1066,7 @@ local langList={
|
||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||
radarData={
|
||||
"D'PM",
|
||||
"OPM",
|
||||
"ADPM",
|
||||
"APM",
|
||||
"SPM",
|
||||
"L'PM",
|
||||
@@ -1088,11 +1092,11 @@ local langList={
|
||||
"This is just an ordinary block game, not a certain one.",
|
||||
"It plays like TO/C2/KOS/TGM3 and others.",
|
||||
"",
|
||||
"bug reports/suggestions, sent to the author's testing group or email ~",
|
||||
"You can send bug reports or suggestions to the author's testing group or email ~",
|
||||
"This is a free download available only through discord.gg/f9pUvkh",
|
||||
"The game downloaded from other sources may contain viruses,",
|
||||
"and only vibration & networking permissions are needed for mobile versions!",
|
||||
"The author is not responsible for any losses from modifying the game.",
|
||||
"The author is not responsible for any loss of data from modifying the game.",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
@@ -1101,17 +1105,19 @@ local langList={
|
||||
"Program: MrZ, FinnTenzor",
|
||||
"Art: MrZ, (Gnyar)",
|
||||
"Music: MrZ, (T0722)",
|
||||
"Voice/ Sound: MrZ, Miya",
|
||||
"Performance: 模电 HBM",
|
||||
"Test: 思竣 Web: 渣渣120",
|
||||
"Voice & Sound: MrZ, Miya",
|
||||
"Performance: 模电, HBM",
|
||||
"Test: 思竣",
|
||||
"Eng Doc: User670",
|
||||
"Web: 渣渣120",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Farter, 蕴空之灵,",
|
||||
"Teatube, [All test staff]",
|
||||
},
|
||||
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
|
||||
used="Tools used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
|
||||
support="Support author",
|
||||
group="Official QQ Group(if not hacked):1080457319",
|
||||
group="Official QQ Group (if not hacked): 1127702001",
|
||||
WidgetText={
|
||||
calculator={
|
||||
_1="1",_2="2",_3="3",
|
||||
@@ -1127,7 +1133,7 @@ local langList={
|
||||
main={
|
||||
play="Play",
|
||||
setting="Settings",
|
||||
music="Music room",
|
||||
music="Music Room",
|
||||
stat="Statistics",
|
||||
help="Help",
|
||||
qplay="Q. Play",
|
||||
@@ -1157,7 +1163,7 @@ local langList={
|
||||
set4="Blind (4)",
|
||||
set5="Master (5)",
|
||||
seq="Advanced(Q)",
|
||||
draw="Field Edit(E)",
|
||||
draw="Edit Field (E)",
|
||||
back="Back",
|
||||
},
|
||||
sequence={
|
||||
@@ -1173,6 +1179,7 @@ local langList={
|
||||
back="Back",
|
||||
},
|
||||
draw={
|
||||
b12="[ ]",
|
||||
any="Erase",
|
||||
space="×",
|
||||
clear="Clear",
|
||||
@@ -1195,16 +1202,16 @@ local langList={
|
||||
setting_game={
|
||||
graphic="←Video",
|
||||
sound="Sound→",
|
||||
ctrl="Control settings",
|
||||
ctrl="Control Settings",
|
||||
key="Key Mappings",
|
||||
touch="Touch Settings",
|
||||
reTime="Start Delay",
|
||||
maxNext="Next Queue Length",
|
||||
layout="Layout",
|
||||
autoPause="Pause when lose focus",
|
||||
autoPause="Pause when focus is lost",
|
||||
swap="Key Combination (Change Atk. Mode)",
|
||||
fine="Finesse Error Sound",
|
||||
lock="Game Lock(pw=626)",
|
||||
appLock="App Lock (Password: 626)",
|
||||
back="Back",
|
||||
},
|
||||
setting_video={
|
||||
@@ -1214,18 +1221,19 @@ local langList={
|
||||
smooth="Smooth drop",
|
||||
center="Center",
|
||||
grid="Grid",
|
||||
bagLine="Bag line",
|
||||
lockFX="Lock FX level",
|
||||
dropFX="Drop FX level",
|
||||
clearFX="Clear FX level",
|
||||
shakeFX="Field Sway level",
|
||||
atkFX="ATK. FX level",
|
||||
bagLine="Bag Line",
|
||||
lockFX="Lock FX Level",
|
||||
dropFX="Drop FX Level",
|
||||
moveFX="Move FX Level",
|
||||
clearFX="Clear FX Level",
|
||||
shakeFX="Field Sway Level",
|
||||
atkFX="ATK. FX Level",
|
||||
frame="Render Frame Rate",
|
||||
text="Action Text",
|
||||
warn="Death Alert",
|
||||
fullscreen="Full Screen",
|
||||
bg="Background",
|
||||
power="Power Info.",
|
||||
power="Power Info",
|
||||
back="Back",
|
||||
},
|
||||
setting_sound={
|
||||
@@ -1278,9 +1286,9 @@ local langList={
|
||||
b13="Ins Down:", b14="Down 1:", b15="Down 4:", b16="Down 10:",
|
||||
b17="Left Drop:", b18="Right Drop:", b19="Left Zangi:", b20="Right Zangi:",
|
||||
norm="Normal",
|
||||
pro="Professioanl",
|
||||
pro="Professional",
|
||||
hide="Show Virtual Key",
|
||||
track="Auto track",
|
||||
track="Auto Track",
|
||||
sfx="SFX",
|
||||
vib="VIB",
|
||||
icon="Icon",
|
||||
@@ -1315,9 +1323,9 @@ local langList={
|
||||
},
|
||||
debug={
|
||||
reset="Reset?",
|
||||
reset1="Reset rank",
|
||||
reset1="Reset ranks",
|
||||
reset2="Reset data",
|
||||
reset3="Reset ALL",
|
||||
reset3="Reset all",
|
||||
back="Back",
|
||||
},
|
||||
},
|
||||
@@ -1351,13 +1359,13 @@ local langList={
|
||||
["master_beginner"]= {"Master", "LUNATIC", "For 20G beginners."},
|
||||
["master_advance"]= {"Master", "ULTIMATE", "Professional 20G challenge!"},
|
||||
["master_final"]= {"Master", "FINAL", "20G: Unreachable end point!"},
|
||||
["GM"]= {"GrandMaster", "GM", "To be Grand Master"},
|
||||
["GM"]= {"GrandMaster", "GM", "To be a Grand Master, take \nthis challenge."},
|
||||
["blind_easy"]= {"Blind", "HALF", "For novice players."},
|
||||
["blind_normal"]= {"Blind", "ALL", "For intermediate players."},
|
||||
["blind_hard"]= {"Blind", "SUDDEN", "For experienced players."},
|
||||
["blind_lunatic"]= {"Blind", "SUDDEN+", "For professionals."},
|
||||
["blind_ultimate"]= {"Blind", "?", "R U Ready?"},
|
||||
["blind_wtf"]= {"Blind", "WTF", "i m not ready"},
|
||||
["blind_ultimate"]= {"Blind", "?", "Are you ready?"},
|
||||
["blind_wtf"]= {"Blind", "WTF", "You're not ready."},
|
||||
["classic_fast"]= {"Classic", "CTWC", "High-speed classic mode."},
|
||||
["survivor_easy"]= {"Survivor", "EASY", "How long can you survive?"},
|
||||
["survivor_normal"]= {"Survivor", "NORMAL", "How long can you survive?"},
|
||||
@@ -1395,7 +1403,7 @@ local langList={
|
||||
["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."},
|
||||
["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"},
|
||||
["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"},
|
||||
["sprintPenta"]= {"Sprint", "Pentomino", "Puzzle-18"},
|
||||
["sprintPenta"]= {"Sprint", "Pentomino", "Clear 40 lines with pentominoes.\n18 pentominoes in each bag."},
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -1417,6 +1425,7 @@ local langList={
|
||||
stage=function(n)return"::"..n.."::"end,
|
||||
great="!~",
|
||||
awesome="!!~",
|
||||
almost="...!",
|
||||
continue="~~",
|
||||
maxspeed="!!!",
|
||||
speedup="~!~",
|
||||
@@ -1516,7 +1525,7 @@ local langList={
|
||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||
radarData={
|
||||
"D'PM",
|
||||
"OPM",
|
||||
"ADPM",
|
||||
"APM",
|
||||
"SPM",
|
||||
"L'PM",
|
||||
@@ -1555,9 +1564,11 @@ local langList={
|
||||
"Program: MrZ, FinnTenzor",
|
||||
"Art: MrZ, (Gnyar)",
|
||||
"Music: MrZ, (T0722)",
|
||||
"Voice/ Sound: MrZ, Miya",
|
||||
"Performance: 模电 HBM",
|
||||
"Test: 思竣 Web: 渣渣120",
|
||||
"Voice % Sound: MrZ, Miya",
|
||||
"Performance: 模电, HBM",
|
||||
"Test: 思竣",
|
||||
"Eng Doc: User670",
|
||||
"Web: 渣渣120",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Farter, 蕴空之灵,",
|
||||
@@ -1565,7 +1576,7 @@ local langList={
|
||||
},
|
||||
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
|
||||
support="Support author",
|
||||
group="Official QQ Group(if not hacked):1080457319",
|
||||
group="Official QQ Group(if not hacked):1127702001",
|
||||
WidgetText={
|
||||
calculator={
|
||||
_1="1",_2="2",_3="3",
|
||||
@@ -1627,6 +1638,7 @@ local langList={
|
||||
back="X",
|
||||
},
|
||||
draw={
|
||||
b12="[ ]",
|
||||
any="_",
|
||||
space="×",
|
||||
clear="XXX",
|
||||
@@ -1658,7 +1670,7 @@ local langList={
|
||||
autoPause="A||",
|
||||
swap="=+=+=",
|
||||
fine="!#!X #!#",
|
||||
lock="?XX(=626)",
|
||||
appLock="?XX(=626)",
|
||||
back="X",
|
||||
},
|
||||
setting_video={
|
||||
@@ -1671,6 +1683,7 @@ local langList={
|
||||
bagLine="123|123",
|
||||
lockFX="↓_~",
|
||||
dropFX="↓~",
|
||||
moveFX="←→~",
|
||||
clearFX="↓↓↓~",
|
||||
shakeFX="~|~|~",
|
||||
atkFX="→→~",
|
||||
@@ -1871,6 +1884,7 @@ local langList={
|
||||
stage=function(n)return"关卡 "..n end,
|
||||
great="不错的",
|
||||
awesome="您很强",
|
||||
almost="太舒服了",
|
||||
continue="您继续",
|
||||
maxspeed="速度封顶",
|
||||
speedup="速度加快",
|
||||
@@ -1938,8 +1952,6 @@ local langList={
|
||||
unlockSavingError="解锁保存失败:",
|
||||
recSavingError="纪录保存失败:",
|
||||
|
||||
ai_fixed="不能同时开启AI和固定序列",
|
||||
ai_prebag="不能同时开启AI和自定义序列",
|
||||
switchSpawnSFX="请开启方块出生音效",
|
||||
|
||||
needRestart="重新开始以生效",
|
||||
@@ -1979,7 +1991,7 @@ local langList={
|
||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||
radarData={
|
||||
"D'PM",
|
||||
"OPM",
|
||||
"ADPM",
|
||||
"APM",
|
||||
"SPM",
|
||||
"L'PM",
|
||||
@@ -1997,8 +2009,8 @@ local langList={
|
||||
"挖掘/挖掘攻击:",
|
||||
"效率/挖掘效率:",
|
||||
"多余操作/极简率:",
|
||||
"满贯/大满贯:",
|
||||
"全/半清:",
|
||||
"牛逼/很牛逼:",
|
||||
"消光/消半截:",
|
||||
},
|
||||
help={
|
||||
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",
|
||||
@@ -2007,7 +2019,7 @@ local langList={
|
||||
"",
|
||||
"使用LOVE2D引擎",
|
||||
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
|
||||
"仅通过内测群1080457319进行免费下载/更新",
|
||||
"仅通过内测群1127702001进行免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
|
||||
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
@@ -2037,7 +2049,7 @@ local langList={
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
|
||||
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
|
||||
WidgetText={
|
||||
calculator={
|
||||
_1="1",_2="2",_3="3",
|
||||
@@ -2099,6 +2111,7 @@ local langList={
|
||||
back="返回",
|
||||
},
|
||||
draw={
|
||||
b12="[ ]",
|
||||
any="不定",
|
||||
space="×",
|
||||
clear="清除",
|
||||
@@ -2130,7 +2143,7 @@ local langList={
|
||||
autoPause="失去焦点自动暂停",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
lock="家长锁(密码626)",
|
||||
appLock="家长锁(密码626)",
|
||||
back="返回",
|
||||
},
|
||||
setting_video={
|
||||
@@ -2143,6 +2156,7 @@ local langList={
|
||||
bagLine="包分界线",
|
||||
lockFX="锁定特效等级",
|
||||
dropFX="下落特效等级",
|
||||
moveFX="移动特效等级",
|
||||
clearFX="消除特效等级",
|
||||
shakeFX="晃动特效等级",
|
||||
atkFX="攻击特效等级",
|
||||
|
||||
@@ -9,11 +9,11 @@ local mStr=mStr
|
||||
local scr=scr
|
||||
local scs=require("parts/spinCenters")
|
||||
local modeRankColor={
|
||||
color.bronze, --Rank1
|
||||
color.lGrey, --Rank2
|
||||
color.lYellow, --Rank3
|
||||
color.lPurple, --Rank4
|
||||
color.lCyan, --Rank5
|
||||
color.dRed, --D
|
||||
color.dOrange, --C
|
||||
color.lYellow, --B
|
||||
color.lBlue, --A
|
||||
color.lCyan, --S
|
||||
color.lGreen, --Special
|
||||
}
|
||||
local rankString={
|
||||
@@ -101,8 +101,9 @@ function Pnt.calculator()
|
||||
setFont(45)
|
||||
if S.reg then gc.printf(S.reg,0,100,720,"right")end
|
||||
if S.val then gc.printf(S.val,0,150,720,"right")end
|
||||
setFont(50)
|
||||
if S.sym then gc.print(S.sym,126,150)end
|
||||
|
||||
if S.sym then setFont(50)gc.print(S.sym,126,150)end
|
||||
if S.pass then setFont(40)mStr(S.tip,640,10)end
|
||||
end
|
||||
function Pnt.load()
|
||||
local S=sceneTemp
|
||||
@@ -111,13 +112,15 @@ function Pnt.load()
|
||||
gc.rectangle("fill",300,330,S.cur/S.tar*680,60,5)
|
||||
gc.setColor(1,1,1)
|
||||
gc.rectangle("line",300,330,680,60,5)
|
||||
setFont(35)
|
||||
gc.print(text.load[S.phase],340,335)
|
||||
if S.phase~=0 then
|
||||
gc.printf(S.cur.."/"..S.tar,795,335,150,"right")
|
||||
if not setting.appLock then
|
||||
setFont(35)
|
||||
gc.print(text.load[S.phase],340,335)
|
||||
if S.phase~=0 then
|
||||
gc.printf(S.cur.."/"..S.tar,795,335,150,"right")
|
||||
end
|
||||
setFont(25)
|
||||
mStr(S.tip,640,400)
|
||||
end
|
||||
setFont(25)
|
||||
mStr(S.tip,640,400)
|
||||
end
|
||||
|
||||
local titleTransform={
|
||||
@@ -312,10 +315,8 @@ end
|
||||
function Pnt.music()
|
||||
gc.setColor(1,1,1,.3+sin(Timer()*5)*.2)
|
||||
gc.rectangle("fill",45,98+30*sceneTemp,250,30)
|
||||
gc.setColor(.7,.7,.7)
|
||||
gc.draw(drawableText.musicRoom,20,20)
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(drawableText.musicRoom,22,23)
|
||||
gc.setColor(.7,.7,.7)gc.draw(drawableText.musicRoom,20,20)
|
||||
gc.setColor(1,1,1)gc.draw(drawableText.musicRoom,22,23)
|
||||
gc.draw(drawableText.nowPlaying,490,390)
|
||||
setFont(30)
|
||||
for i=1,BGM.len do
|
||||
@@ -641,7 +642,7 @@ function Pnt.setting_video()
|
||||
mText(drawableText.setting_video,640,15)
|
||||
end
|
||||
function Pnt.setting_sound()
|
||||
gc.setColor(1,1,1,.8)
|
||||
gc.setColor(1,1,1)
|
||||
mText(drawableText.setting_sound,640,15)
|
||||
local t=Timer()
|
||||
local _=sceneTemp.jump
|
||||
@@ -674,7 +675,8 @@ function Pnt.setting_control()
|
||||
gc.line(950,530,950,630)
|
||||
|
||||
--Texts
|
||||
gc.draw(drawableText.setting_control,80,50)
|
||||
gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_control,80,50)
|
||||
gc.setColor(1,1,1)gc.draw(drawableText.setting_control,80,50)
|
||||
setFont(50)
|
||||
gc.printf(text.preview,320,540,200,"right")
|
||||
|
||||
@@ -744,7 +746,8 @@ function Pnt.setting_key()
|
||||
gc.draw(drawableText.ctrlSetHelp,50,650)
|
||||
end
|
||||
function Pnt.setting_skin()
|
||||
gc.setColor(1,1,1)
|
||||
gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_skin,80,50)
|
||||
gc.setColor(1,1,1)gc.draw(drawableText.setting_skin,80,50)
|
||||
for N=1,7 do
|
||||
local face=setting.face[N]
|
||||
local B=blocks[N][face]
|
||||
@@ -760,7 +763,6 @@ function Pnt.setting_skin()
|
||||
for i=1,6 do
|
||||
gc.draw(blockSkin[11+i],570+60*i,610,nil,2)
|
||||
end
|
||||
gc.draw(drawableText.setting_skin,80,50)
|
||||
end
|
||||
function Pnt.setting_touch()
|
||||
gc.setColor(1,1,1)
|
||||
|
||||
@@ -13,14 +13,15 @@ function sceneInit.calculator()
|
||||
val=0,
|
||||
sym=false,
|
||||
pass=false,
|
||||
tip=require("parts/getTip"),
|
||||
}
|
||||
end
|
||||
function sceneInit.load()
|
||||
sceneTemp={
|
||||
phase=1,--Loading stage
|
||||
cur=1,--Counter
|
||||
tar=#VOC.name,--Loading bar lenth(current)
|
||||
tip=require("parts/getTip"),
|
||||
tar=#VOC.name,--Loading bar length(current)
|
||||
tip=setting.appLock or require("parts/getTip"),
|
||||
list={
|
||||
#VOC.name,
|
||||
#BGM.list,
|
||||
@@ -48,16 +49,9 @@ function sceneInit.main()
|
||||
BG.set("space")
|
||||
BGM.play("blank")
|
||||
|
||||
game.frame=0
|
||||
game.recording=false
|
||||
game.replaying=false
|
||||
game.seed=1046101471
|
||||
game.rec={}
|
||||
|
||||
modeEnv={}
|
||||
destroyPlayers()
|
||||
|
||||
--Create demo player
|
||||
destroyPlayers()
|
||||
PLY.newDemoPlayer(1,900,35,1.1)
|
||||
end
|
||||
function sceneInit.music()
|
||||
@@ -131,20 +125,20 @@ function sceneInit.pause(org)
|
||||
format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend),
|
||||
format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]),
|
||||
format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]),
|
||||
format("%d/%d;%d/%d",S.b2b,S.b3b,S.pc,S.hpc),
|
||||
format("%d[%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
|
||||
format("%d/%d ; %d/%d",S.b2b,S.b3b,S.pc,S.hpc),
|
||||
format("%d [%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
|
||||
},
|
||||
|
||||
--From right-down, 60 degree each
|
||||
radar={
|
||||
(S.off+S.dig)/S.time*60,--DefPM
|
||||
(S.off)/S.time*60, --OffPM
|
||||
(S.send+S.dig)/S.time*60,--ADPM
|
||||
S.atk/S.time*60, --AtkPM
|
||||
S.send/S.time*60, --SendPM
|
||||
S.piece/S.time*24, --LinePM
|
||||
S.dig/S.time*60, --DigPM
|
||||
},
|
||||
val={1/80,1/40,1/60,1/60,1/100,1/40},
|
||||
val={1/80,1/80,1/80,1/60,1/100,1/40},
|
||||
timing=org=="play",
|
||||
}
|
||||
local _=sceneTemp
|
||||
@@ -204,7 +198,7 @@ function sceneInit.setting_control()
|
||||
dir=1,
|
||||
wait=30,
|
||||
}
|
||||
BG.set("game1")
|
||||
BG.set("bg1")
|
||||
end
|
||||
function sceneInit.setting_key()
|
||||
sceneTemp={
|
||||
@@ -214,7 +208,7 @@ function sceneInit.setting_key()
|
||||
}
|
||||
end
|
||||
function sceneInit.setting_touch()
|
||||
BG.set("game3")
|
||||
BG.set("rainbow")
|
||||
sceneTemp={
|
||||
default=1,
|
||||
snap=1,
|
||||
@@ -271,7 +265,7 @@ function sceneInit.stat()
|
||||
end
|
||||
end
|
||||
function sceneInit.history()
|
||||
BG.set("game3")
|
||||
BG.set("rainbow")
|
||||
sceneTemp={
|
||||
text=require("parts/updateLog"),--Text list
|
||||
pos=1,--Scroll pos
|
||||
@@ -329,7 +323,7 @@ end
|
||||
local SCN={
|
||||
cur="load",--Current scene
|
||||
swapping=false,--If Swapping
|
||||
swap={
|
||||
stat={
|
||||
tar=nil, --Swapping target
|
||||
style=nil, --Swapping style
|
||||
mid=nil, --Loading point
|
||||
@@ -340,7 +334,7 @@ local SCN={
|
||||
}--Scene datas, returned
|
||||
|
||||
function SCN.swapUpdate()
|
||||
local S=SCN.swap
|
||||
local S=SCN.stat
|
||||
S.time=S.time-1
|
||||
if S.time==S.mid then
|
||||
SCN.init(S.tar,SCN.cur)
|
||||
@@ -395,7 +389,7 @@ local swap={
|
||||
end},
|
||||
}--Scene swapping animations
|
||||
function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
|
||||
local S=SCN.swap
|
||||
local S=SCN.stat
|
||||
if not SCN.swapping and tar~=SCN.cur then
|
||||
SCN.swapping=true
|
||||
if not style then style="fade"end
|
||||
@@ -407,7 +401,7 @@ function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
|
||||
S.draw=swap[3]
|
||||
end
|
||||
end
|
||||
function SCN.goto(tar,style)--Normal scene swapping, can back
|
||||
function SCN.go(tar,style)--Normal scene swapping, can back
|
||||
SCN.push()SCN.swapTo(tar,style)
|
||||
end
|
||||
function SCN.back()
|
||||
|
||||
@@ -39,18 +39,15 @@ function Tmr.load()
|
||||
SKIN.load()
|
||||
stat.run=stat.run+1
|
||||
--------------------------
|
||||
SFX.play("welcome_sfx")
|
||||
VOC.play("welcome")
|
||||
if not setting.appLock then
|
||||
SFX.play("welcome_sfx")
|
||||
VOC.play("welcome")
|
||||
end
|
||||
else
|
||||
S.cur=S.cur+1
|
||||
S.tar=S.cur
|
||||
if S.cur>62.6 then
|
||||
if newVersionLaunch then
|
||||
SCN.push("intro","fade")
|
||||
SCN.swapTo("history","fade")
|
||||
else
|
||||
SCN.swapTo("intro","none")
|
||||
end
|
||||
SCN.swapTo(setting.appLock and "calculator"or"intro","none")
|
||||
end
|
||||
loadingFinished=true
|
||||
return
|
||||
@@ -131,7 +128,7 @@ function Tmr.mode(dt)
|
||||
cam.x1=cam.x1*.85+x*.15
|
||||
cam.y1=cam.y1*.85+y*.15
|
||||
cam.k1=cam.k1*.85+k*.15
|
||||
local _=SCN.swap.tar
|
||||
local _=SCN.stat.tar
|
||||
cam.zoomMethod=_=="play"and 1 or _=="mode"and 2
|
||||
if cam.zoomMethod==1 then
|
||||
if cam.sel then
|
||||
@@ -354,8 +351,6 @@ function Tmr.staff(dt)
|
||||
S.time=S.time+S.v*dt
|
||||
if S.time>45 then
|
||||
S.time=45
|
||||
elseif S.time<-10 then
|
||||
S.time=-10
|
||||
end
|
||||
end
|
||||
return Tmr
|
||||
@@ -99,37 +99,37 @@ newSlider=WIDGET.newSlider
|
||||
local Widgets={
|
||||
load={},intro={},quit={},
|
||||
calculator={
|
||||
newKey({name="_1", x=300,y=300,w=90,h=90, color="white", font=50,code=pressKey("1")}),
|
||||
newKey({name="_2", x=400,y=300,w=90,h=90, color="white", font=50,code=pressKey("2")}),
|
||||
newKey({name="_3", x=500,y=300,w=90,h=90, color="white", font=50,code=pressKey("3")}),
|
||||
newKey({name="_4", x=300,y=400,w=90,h=90, color="white", font=50,code=pressKey("4")}),
|
||||
newKey({name="_5", x=400,y=400,w=90,h=90, color="white", font=50,code=pressKey("5")}),
|
||||
newKey({name="_6", x=500,y=400,w=90,h=90, color="white", font=50,code=pressKey("6")}),
|
||||
newKey({name="_7", x=300,y=500,w=90,h=90, color="white", font=50,code=pressKey("7")}),
|
||||
newKey({name="_8", x=400,y=500,w=90,h=90, color="white", font=50,code=pressKey("8")}),
|
||||
newKey({name="_9", x=500,y=500,w=90,h=90, color="white", font=50,code=pressKey("9")}),
|
||||
newKey({name="_0", x=300,y=600,w=90,h=90, color="white", font=50,code=pressKey("0")}),
|
||||
newKey({name="<", x=400,y=600,w=90,h=90, color="lRed", font=50,code=pressKey("backspace")}),
|
||||
newKey({name="=", x=500,y=600,w=90,h=90, color="lYellow",font=50,code=pressKey("return")}),
|
||||
newKey({name="+", x=600,y=300,w=90,h=90, color="lBlue", font=50,code=pressKey("+")}),
|
||||
newKey({name="-", x=600,y=400,w=90,h=90, color="lBlue", font=50,code=pressKey("-")}),
|
||||
newKey({name="*", x=600,y=500,w=90,h=90, color="lBlue", font=50,code=pressKey("*")}),
|
||||
newKey({name="/", x=600,y=600,w=90,h=90, color="lBlue", font=50,code=pressKey("/")}),
|
||||
newButton({name="play", x=800,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
|
||||
newKey({name="_1", x=150,y=300,w=90,h=90, color="white", font=50,code=pressKey("1")}),
|
||||
newKey({name="_2", x=250,y=300,w=90,h=90, color="white", font=50,code=pressKey("2")}),
|
||||
newKey({name="_3", x=350,y=300,w=90,h=90, color="white", font=50,code=pressKey("3")}),
|
||||
newKey({name="_4", x=150,y=400,w=90,h=90, color="white", font=50,code=pressKey("4")}),
|
||||
newKey({name="_5", x=250,y=400,w=90,h=90, color="white", font=50,code=pressKey("5")}),
|
||||
newKey({name="_6", x=350,y=400,w=90,h=90, color="white", font=50,code=pressKey("6")}),
|
||||
newKey({name="_7", x=150,y=500,w=90,h=90, color="white", font=50,code=pressKey("7")}),
|
||||
newKey({name="_8", x=250,y=500,w=90,h=90, color="white", font=50,code=pressKey("8")}),
|
||||
newKey({name="_9", x=350,y=500,w=90,h=90, color="white", font=50,code=pressKey("9")}),
|
||||
newKey({name="_0", x=150,y=600,w=90,h=90, color="white", font=50,code=pressKey("0")}),
|
||||
newKey({name="<", x=250,y=600,w=90,h=90, color="lRed", font=50,code=pressKey("backspace")}),
|
||||
newKey({name="=", x=350,y=600,w=90,h=90, color="lYellow",font=50,code=pressKey("return")}),
|
||||
newKey({name="+", x=450,y=300,w=90,h=90, color="lBlue", font=50,code=pressKey("+")}),
|
||||
newKey({name="-", x=450,y=400,w=90,h=90, color="lBlue", font=50,code=pressKey("-")}),
|
||||
newKey({name="*", x=450,y=500,w=90,h=90, color="lBlue", font=50,code=pressKey("*")}),
|
||||
newKey({name="/", x=450,y=600,w=90,h=90, color="lBlue", font=50,code=pressKey("/")}),
|
||||
newButton({name="play", x=640,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
|
||||
},
|
||||
main={
|
||||
newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=function()SCN.goto("mode")end}),
|
||||
newButton({name="setting", x=370,y=280,w=200,h=160,color="lBlue", font=45,code=function()SCN.goto("setting_game")end}),
|
||||
newButton({name="music", x=590,y=280,w=200,h=160,color="lPurple",font=32,code=function()SCN.goto("music")end}),
|
||||
newButton({name="help", x=150,y=460,w=200,h=160,color="lYellow",font=50,code=function()SCN.goto("help")end}),
|
||||
newButton({name="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=function()SCN.goto("stat")end}),
|
||||
newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=function()SCN.go("mode")end}),
|
||||
newButton({name="setting", x=370,y=280,w=200,h=160,color="lBlue", font=45,code=function()SCN.go("setting_game")end}),
|
||||
newButton({name="music", x=590,y=280,w=200,h=160,color="lPurple",font=32,code=function()SCN.go("music")end}),
|
||||
newButton({name="help", x=150,y=460,w=200,h=160,color="lYellow",font=50,code=function()SCN.go("help")end}),
|
||||
newButton({name="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=function()SCN.go("stat")end}),
|
||||
newButton({name="qplay", x=590,y=460,w=200,h=160,color="lOrange",font=43,code=function()SCN.push()loadGame(stat.lastPlay,true)end}),
|
||||
newButton({name="lang", x=150,y=610,w=160,h=100,color="lGreen", font=45,code=function()SCN.goto("setting_lang")end}),
|
||||
newButton({name="lang", x=150,y=610,w=160,h=100,color="lGreen", font=45,code=function()SCN.go("setting_lang")end}),
|
||||
newButton({name="quit", x=590,y=610,w=160,h=100,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}),
|
||||
},
|
||||
mode={
|
||||
newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=function()
|
||||
SCN.goto("custom")
|
||||
SCN.go("custom")
|
||||
end,
|
||||
hide=function()
|
||||
return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle"
|
||||
@@ -238,18 +238,18 @@ local Widgets={
|
||||
setting_game={
|
||||
newButton({name="graphic", x=200, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_video","swipe")end}),
|
||||
newButton({name="sound", x=1080, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_sound","swipe")end}),
|
||||
newButton({name="ctrl", x=290, y=220, w=320,h=80, color="lYellow",font=35,code=function()SCN.goto("setting_control")end}),
|
||||
newButton({name="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=function()SCN.goto("setting_key")end}),
|
||||
newButton({name="touch", x=990, y=220, w=320,h=80, color="lBlue", font=35,code=function()SCN.goto("setting_touch")end}),
|
||||
newButton({name="ctrl", x=290, y=220, w=320,h=80, color="lYellow",font=35,code=function()SCN.go("setting_control")end}),
|
||||
newButton({name="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=function()SCN.go("setting_key")end}),
|
||||
newButton({name="touch", x=990, y=220, w=320,h=80, color="lBlue", font=35,code=function()SCN.go("setting_touch")end}),
|
||||
newSlider({name="reTime", x=350, y=340, w=300,unit=10, font=30,disp=SETval("reTime"), code=SETsto("reTime")}),
|
||||
newSlider({name="maxNext", x=350, y=440, w=300,unit=6, font=30,disp=SETval("maxNext"), code=SETsto("maxNext")}),
|
||||
newButton({name="layout", x=460, y=540, w=140,h=70,color="white", font=35,code=function()
|
||||
SCN.goto("setting_skin")
|
||||
SCN.go("setting_skin")
|
||||
end}),
|
||||
newSwitch({name="autoPause",x=1080, y=320, font=20,disp=SETval("autoPause"), code=SETrev("autoPause")}),
|
||||
newSwitch({name="swap", x=1080, y=380, font=20,disp=SETval("swap"), code=SETrev("swap")}),
|
||||
newSwitch({name="fine", x=1080, y=440, font=20,disp=SETval("fine"), code=SETrev("fine")}),
|
||||
newSwitch({name="lock", x=1080, y=500, font=20,disp=SETval("lock"), code=SETrev("lock")}),
|
||||
newSwitch({name="appLock", x=1080, y=500, font=20,disp=SETval("appLock"), code=SETrev("appLock")}),
|
||||
newButton({name="back", x=1140, y=650, w=200,h=80,color="white", font=40,code=BACK}),
|
||||
},
|
||||
setting_video={
|
||||
@@ -260,11 +260,12 @@ local Widgets={
|
||||
newSwitch({name="center", x=500, y=180,font=35, disp=SETval("center"), code=SETrev("center")}),
|
||||
newSwitch({name="grid", x=500, y=260,font=35, disp=SETval("grid"), code=SETrev("grid")}),
|
||||
newSwitch({name="bagLine", x=730, y=180,font=30, disp=SETval("bagLine"), code=SETrev("bagLine")}),
|
||||
newSlider({name="lockFX", x=350, y=340,w=373,unit=3, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
|
||||
newSlider({name="dropFX", x=350, y=400,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
|
||||
newSlider({name="clearFX", x=350, y=460,w=373,unit=3, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
|
||||
newSlider({name="shakeFX", x=350, y=520,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
|
||||
newSlider({name="atkFX", x=350, y=580,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
|
||||
newSlider({name="lockFX", x=350, y=340,w=373,unit=5, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
|
||||
newSlider({name="dropFX", x=350, y=390,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
|
||||
newSlider({name="moveFX", x=350, y=440,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
|
||||
newSlider({name="clearFX", x=350, y=490,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
|
||||
newSlider({name="shakeFX", x=350, y=540,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
|
||||
newSlider({name="atkFX", x=350, y=590,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
|
||||
newSlider({name="frame", x=350, y=640,w=373,unit=10,font=30,
|
||||
disp=function()
|
||||
return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4
|
||||
@@ -390,7 +391,7 @@ local Widgets={
|
||||
end}),
|
||||
newButton({name="option", x=520,y=180,w=170,h=80,color="white",font=40,
|
||||
code=function()
|
||||
SCN.goto("setting_touchSwitch")
|
||||
SCN.go("setting_touchSwitch")
|
||||
end}),
|
||||
newButton({name="back", x=760,y=180,w=170,h=80,color="white",font=40,code=BACK}),
|
||||
newSlider({name="size", x=450,y=265,w=460,unit=14,font=40,
|
||||
@@ -436,7 +437,7 @@ local Widgets={
|
||||
newSwitch({name="icon", x=850, y=300, font=40,disp=SETval("VKIcon"),code=SETrev("VKIcon")}),
|
||||
newButton({name="tkset", x=1120, y=420, w=240,h=80,color="white",font=32,
|
||||
code=function()
|
||||
SCN.goto("setting_trackSetting")
|
||||
SCN.go("setting_trackSetting")
|
||||
end,
|
||||
hide=function()
|
||||
return not setting.VKTrack
|
||||
@@ -459,8 +460,8 @@ local Widgets={
|
||||
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}),
|
||||
},
|
||||
help={
|
||||
newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=function()SCN.goto("staff")end}),
|
||||
newButton({name="his", x=1160, y=500,w=150,h=80,color="white",font=32,code=function()SCN.goto("history")end}),
|
||||
newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=function()SCN.go("staff")end}),
|
||||
newButton({name="his", x=1160, y=500,w=150,h=80,color="white",font=32,code=function()SCN.go("history")end}),
|
||||
newButton({name="qq", x=1070, y=600,w=200,h=80,color="white",font=32,code=function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,hide=mobileHide}),
|
||||
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}),
|
||||
},
|
||||
|
||||
2
conf.lua
2
conf.lua
@@ -1,4 +1,4 @@
|
||||
gameVersion="Alpha V0.10.3"
|
||||
gameVersion="Alpha V0.10.6"
|
||||
function love.conf(t)
|
||||
t.identity="Techmino"--Saving folder
|
||||
t.version="11.1"
|
||||
|
||||
87
main.lua
87
main.lua
@@ -1,11 +1,11 @@
|
||||
--[[
|
||||
______ __ _
|
||||
/_ __/___ _____ / /_ ____ ___ (_)____ ____
|
||||
/ / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \
|
||||
/ / / __// /__ / / / // / / / / // // / / // /_/ /
|
||||
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
|
||||
Techmino is my first "huge project"
|
||||
optimization is welcomed if you also love tetromino game
|
||||
______ __ _
|
||||
/_ __/___ _____ / /_ ____ ___ (_)____ ____
|
||||
/ / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \
|
||||
/ / / __// /__ / / / // / / / / // // / / // /_/ /
|
||||
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
|
||||
Techmino is my first "huge project"
|
||||
optimization is welcomed if you also love tetromino game
|
||||
]]--
|
||||
|
||||
--?
|
||||
@@ -19,7 +19,6 @@ love.keyboard.setTextInput(false)
|
||||
love.mouse.setVisible(false)
|
||||
|
||||
system=love.system.getOS()
|
||||
game={}
|
||||
mapCam={
|
||||
sel=nil,--Selected mode ID
|
||||
|
||||
@@ -41,8 +40,8 @@ preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
|
||||
preBag={}
|
||||
|
||||
game={
|
||||
frame=0, --Frame count
|
||||
result=0, --Game result
|
||||
frame=0, --Frame count
|
||||
result=false, --Game result (string)
|
||||
pauseTime=0, --Time paused
|
||||
pauseCount=0, --Pausing count
|
||||
garbageSpeed=1, --Garbage timing speed
|
||||
@@ -50,7 +49,16 @@ game={
|
||||
warnLVL=0, --Warning level (show)
|
||||
recording=false, --If recording
|
||||
replaying=false, --If replaying
|
||||
rec={}, --Recording list, key-time
|
||||
seed=math.random(999999999),--Game seed
|
||||
setting={}, --Game settings
|
||||
rec={}, --Recording list, key,time,key,time...
|
||||
|
||||
--Data for royale mode
|
||||
stage=nil, --Game stage
|
||||
mostBadge=nil, --Most badge owner
|
||||
secBadge=nil, --Second badge owner
|
||||
mostDangerous=nil, --Most dangerous player
|
||||
secDangerous=nil, --Second dangerous player
|
||||
}--Global game data
|
||||
players={alive={}}--Players data
|
||||
curMode=nil--Current mode object
|
||||
@@ -91,6 +99,9 @@ else
|
||||
setting.swap=false
|
||||
setting.vib=2
|
||||
setting.powerInfo=true
|
||||
setting.fullscreen=true
|
||||
love.window.setFullscreen(true)
|
||||
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
|
||||
end
|
||||
end
|
||||
LANG.set(setting.lang)
|
||||
@@ -105,32 +116,34 @@ if fs.getInfo("tech_ultimate.dat")then fs.remove("tech_ultimate.dat")end
|
||||
if fs.getInfo("tech_ultimate+.dat")then fs.remove("tech_ultimate+.dat")end
|
||||
|
||||
--Update modeRanks
|
||||
R=modeRanks
|
||||
for k,v in next,R do
|
||||
if type(k)=="number"then
|
||||
R[Modes[k].name],R[k]=R[k]
|
||||
break
|
||||
do
|
||||
local R=modeRanks
|
||||
for k,v in next,R do
|
||||
if type(k)=="number"then
|
||||
if Modes[k]and not R[Modes[k].name]then
|
||||
R[Modes[k].name]=v
|
||||
end
|
||||
R[k]=nil
|
||||
end
|
||||
end
|
||||
if R.master_adavnce then
|
||||
R.master_advance,R.master_adavnce=R.master_adavnce
|
||||
end
|
||||
if not text.modes[stat.lastPlay]then
|
||||
stat.lastPlay="sprint_10"
|
||||
end
|
||||
end
|
||||
if R.master_adavnce then
|
||||
R.master_advance,R.master_adavnce=R.master_adavnce
|
||||
end
|
||||
if not text.modes[stat.lastPlay]then
|
||||
stat.lastPlay="sprint_10"
|
||||
end
|
||||
|
||||
--Update data file
|
||||
S=stat
|
||||
if type(setting.spawn)~="number"then
|
||||
setting.spawn=0
|
||||
end
|
||||
if S.version~=gameVersion then
|
||||
S.version=gameVersion
|
||||
TEXT.show(text.newVersion,640,200,30,"fly",.3)
|
||||
newVersionLaunch=true
|
||||
--Update data file
|
||||
local S=stat
|
||||
if type(setting.spawn)~="number"then
|
||||
setting.spawn=0
|
||||
end
|
||||
if S.version~=gameVersion then
|
||||
S.version=gameVersion
|
||||
newVersionLaunch=true
|
||||
|
||||
fs.remove("sprintPenta.dat")
|
||||
fs.remove("master_adavnce.dat")
|
||||
fs.remove("master_beginner.dat")
|
||||
end
|
||||
R,S=nil
|
||||
fs.remove("sprintPenta.dat")
|
||||
fs.remove("master_adavnce.dat")
|
||||
fs.remove("master_beginner.dat")
|
||||
end
|
||||
end
|
||||
@@ -34,7 +34,7 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="way",
|
||||
bg="rainbow2",bgm="way",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="shining terminal",
|
||||
bg="rainbow2",bgm="shining terminal",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
hold=false,
|
||||
dropPiece=function(P)P:lose()end,
|
||||
task=nil,
|
||||
bg="game1",bgm="newera",
|
||||
bg="bg1",bgm="newera",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -4,8 +4,9 @@ return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
drop=15,lock=45,
|
||||
fall=10,lock=60,
|
||||
fall=10,
|
||||
center=false,
|
||||
dropFX=0,lockFX=0,
|
||||
visible="none",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=15,
|
||||
|
||||
@@ -7,7 +7,6 @@ return{
|
||||
freshLimit=10,
|
||||
visible="fast",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=10,
|
||||
target=200,
|
||||
bg="glow",bgm="reason",
|
||||
},
|
||||
|
||||
@@ -31,7 +31,11 @@ return{
|
||||
end
|
||||
modeEnv._20G=modeEnv.drop==0
|
||||
modeEnv.oncehold=customSel[6]==1
|
||||
if preBag[1]then modeEnv.bag=preBag end
|
||||
if preBag[1]then
|
||||
modeEnv.bag=preBag
|
||||
else
|
||||
modeEnv.bag=nil
|
||||
end
|
||||
modeEnv.target=0
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L=modeEnv.opponent
|
||||
|
||||
@@ -37,7 +37,7 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="shining terminal",
|
||||
bg="rainbow2",bgm="shining terminal",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -37,7 +37,7 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="way",
|
||||
bg="rainbow2",bgm="way",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
D.event=D.event+1
|
||||
end
|
||||
end,
|
||||
bg="game2",bgm="way",
|
||||
bg="bg2",bgm="way",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
D.event=D.event+1
|
||||
end
|
||||
end,
|
||||
bg="game2",bgm="shining terminal",
|
||||
bg="bg2",bgm="shining terminal",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -1,9 +1,28 @@
|
||||
local format=string.format
|
||||
local function check_rise(P)
|
||||
if #P.clearedRow==0 then
|
||||
local L=P.garbageBeneath
|
||||
if L>0 then
|
||||
if L<3 then
|
||||
P:showTextF(text.almost,0,-120,80,"beat",.8)
|
||||
elseif L<5 then
|
||||
P:showTextF(text.great,0,-120,80,"fly",.8)
|
||||
end
|
||||
end
|
||||
for i=1,8-P.garbageBeneath do
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
else
|
||||
if P.garbageBeneath==0 then
|
||||
P:showTextF(text.awesome,0,-120,80,"beat",.6)
|
||||
SFX.play("clear")
|
||||
BG.send(26)
|
||||
for i=1,8-P.garbageBeneath do
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
else
|
||||
BG.send(#P.clearedRow)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -13,8 +32,8 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=check_rise,
|
||||
pushSpeed=1,
|
||||
bg="glow",bgm="infinite",
|
||||
pushSpeed=1.2,
|
||||
bg="wing",bgm="infinite",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
drop=.5,wait=8,fall=20,
|
||||
target=50,dropPiece=check,
|
||||
bg="game2",bgm="push",
|
||||
bg="bg2",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
slowMark=true,
|
||||
@@ -42,7 +42,7 @@ return{
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=200 and 5 or
|
||||
T<=230 and 5 or
|
||||
T<=270 and 4 or
|
||||
3
|
||||
else
|
||||
|
||||
@@ -17,11 +17,10 @@ return{
|
||||
color=color.green,
|
||||
env={
|
||||
noFly=true,
|
||||
minsdarr=1,
|
||||
wait=8,fall=20,
|
||||
target=10,dropPiece=check_LVup,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
bg="game2",bgm="push",
|
||||
bg="bg2",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
slowMark=true,
|
||||
@@ -42,8 +41,8 @@ return{
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=226 and 5 or
|
||||
T<=262 and 4 or
|
||||
T<=230 and 5 or
|
||||
T<=270 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
|
||||
@@ -17,7 +17,7 @@ local function score(P)
|
||||
--Level up!
|
||||
local s=P.modeData.event+1;P.modeData.event=s
|
||||
local E=P.gameEnv
|
||||
BG.set(s==1 and"game3"or s==2 and"game4"or s==3 and"game5"or s==4 and"game6"or"game5")
|
||||
BG.set(s==1 and"rainbow"or s==2 and"rainbow2"or s==3 and"lightning"or s==4 and"lightning2"or"lightning")
|
||||
E.lock=death_lock[s]
|
||||
E.wait=death_wait[s]
|
||||
E.fall=death_fall[s]
|
||||
@@ -44,7 +44,7 @@ return{
|
||||
fall=death_fall[1],
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="secret7th",
|
||||
bg="bg2",bgm="secret7th",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
|
||||
@@ -16,7 +16,7 @@ local function score(P)
|
||||
--Level up!
|
||||
local s=P.modeData.event+1;P.modeData.event=s
|
||||
local E=P.gameEnv
|
||||
BG.set(s==1 and"game1"or s==2 and"game2"or s==3 and"game3"or "game4")
|
||||
BG.set(s==1 and"bg1"or s==2 and"bg2"or s==3 and"rainbow"or "rainbow2")
|
||||
E.lock=rush_lock[s]
|
||||
E.wait=rush_wait[s]
|
||||
E.fall=rush_fall[s]
|
||||
@@ -48,7 +48,7 @@ return{
|
||||
fall=rush_fall[1],
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
bg="game1",bgm="secret8th",
|
||||
bg="bg1",bgm="secret8th",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
|
||||
@@ -46,7 +46,7 @@ return{
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
easyFresh=false,bone=true,
|
||||
bg="none",bgm="distortion",
|
||||
bg="lightning",bgm="distortion",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=update_round,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=update_round,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=update_round,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=update_round,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=update_round,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=10,dropPiece=PLY.reach_winCheck,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=100,dropPiece=PLY.reach_winCheck,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
T<=90 and 4 or
|
||||
T<=136 and 3 or
|
||||
T<=196 and 2 or
|
||||
T<=260 and 1 or
|
||||
T<=240 and 1 or
|
||||
0
|
||||
end,
|
||||
}
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=1000,dropPiece=PLY.reach_winCheck,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
@@ -30,10 +30,10 @@ return{
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=626 and 5 or
|
||||
T<=888 and 4 or
|
||||
T<=1140 and 3 or
|
||||
T<=1406 and 2 or
|
||||
T<=1626 and 1 or
|
||||
T<=800 and 4 or
|
||||
T<=900 and 3 or
|
||||
T<=1050 and 2 or
|
||||
T<=1200 and 1 or
|
||||
0
|
||||
end,
|
||||
}
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=20,dropPiece=PLY.reach_winCheck,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=40,dropPiece=PLY.reach_winCheck,
|
||||
bg="game2",bgm="race",
|
||||
bg="bg2",bgm="race",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
target=400,dropPiece=PLY.reach_winCheck,
|
||||
bg="game3",bgm="push",
|
||||
bg="rainbow",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
@@ -30,10 +30,10 @@ return{
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=300 and 5 or
|
||||
T<=340 and 4 or
|
||||
T<=462 and 3 or
|
||||
T<=555 and 2 or
|
||||
T<=626 and 1 or
|
||||
T<=330 and 4 or
|
||||
T<=360 and 3 or
|
||||
T<=390 and 2 or
|
||||
T<=420 and 1 or
|
||||
0
|
||||
end,
|
||||
}
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,49 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 2
|
||||
local t=CCloader_filename[system] and 2 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,49)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(2,5)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000))
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(3,5),2,true,10000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(2,5)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000))
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(3,5),2,true,10000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,49 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 4
|
||||
local t=CCloader_filename[system] and 4 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,49)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,7)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000))
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(6,8),3,true,20000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,7)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000))
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(6,8),3,true,20000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,49 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 6
|
||||
local t=CCloader_filename[system] and 6 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,49)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(8,10)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(8,10)-1,4,true,30000))
|
||||
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(9,10),4,true,30000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(8,10)))
|
||||
else
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(8,10)-1,4,true,30000))
|
||||
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(9,10),4,true,30000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,100 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 4
|
||||
local t=CCloader_filename[system] and 4 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,99)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(2,5)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(2,5)-1,2,true,10000))
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(3,5),2,true,10000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(2,5)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(2,5)-1,2,true,10000))
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(3,5),2,true,10000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,100 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 4
|
||||
local t=CCloader_filename[system] and 4 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,99)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(4,7)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(4,7)-1,3,true,20000))
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(6,8),3,true,20000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(4,7)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(4,7)-1,3,true,20000))
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(6,8),3,true,20000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
Fkey=selectTarget,
|
||||
pushSpeed=2,
|
||||
freshLimit=15,
|
||||
bg="game3",bgm="rockblock",
|
||||
bg="rainbow",bgm="rockblock",
|
||||
},
|
||||
load=function()
|
||||
royaleData={
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
}
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L={}for i=1,100 do L[i]=true end
|
||||
local t=system~="Windows"and 0 or 4
|
||||
local t=CCloader_filename[system] and 4 or 0
|
||||
while t>0 do
|
||||
local r=rnd(2,99)
|
||||
if L[r]then L[r],t=false,t-1 end
|
||||
@@ -43,7 +43,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(8,10)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(8,10)-1,4,true,30000))
|
||||
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(9,10),4,true,30000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
if L[n]then
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(8,10)))
|
||||
else
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(8,10)-1,4,true,30000))
|
||||
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(9,10),4,true,30000))
|
||||
end
|
||||
n=n+1
|
||||
end end
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="matrix",bgm="infinite",
|
||||
bg="fan",bgm="infinite",
|
||||
},
|
||||
slowMark=true,
|
||||
pauseLimit=true,
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
drop=120,lock=120,
|
||||
oncehold=false,target=200,
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
bg="game2",bgm="infinite",
|
||||
bg="bg2",bgm="infinite",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
|
||||
57
parts/ai.lua
57
parts/ai.lua
@@ -1,12 +1,10 @@
|
||||
--[[
|
||||
HighestBlock
|
||||
HorizontalTransitions
|
||||
VerticalTransitions
|
||||
BlockedCells
|
||||
Wells
|
||||
FilledLines
|
||||
4deepShape
|
||||
BlockedWells;
|
||||
BlockedWells
|
||||
]]
|
||||
local int,ceil,min,abs,rnd=math.floor,math.ceil,math.min,math.abs,math.random
|
||||
local ins,rem=table.insert,table.remove
|
||||
@@ -18,9 +16,32 @@ local Timer=love.timer.getTime
|
||||
local blockPos={4,4,4,4,4,5,4}
|
||||
local scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}}
|
||||
-------------------------------------------------Cold clear
|
||||
local CCblockID={4,3,6,5,1,2,0}
|
||||
if system=="Windows"then
|
||||
require("CCloader")
|
||||
local CCblockID={6,5,4,3,2,1,0}
|
||||
CCloader_filename={
|
||||
Windows={"CCloader.dll",{"x86_64","x86"}},
|
||||
Android={"libCCloader.so",{"arm64-v8a","armeabi-v7a"}},
|
||||
Linux={"libCCloader.so",{"x86_64"}},
|
||||
}
|
||||
local function loadCC()
|
||||
if not CCloader_filename[system]then return end
|
||||
local f
|
||||
for i=1,#CCloader_filename[system][2]do
|
||||
function f()
|
||||
local CCloader_f,size=love.filesystem.read("data",table.concat({"lib",system,CCloader_filename[system][2][i],CCloader_filename[system][1]},"/"))
|
||||
if not CCloader_f then return end
|
||||
local success,message=love.filesystem.write(CCloader_filename[system][1],CCloader_f,size)
|
||||
if not success then return end
|
||||
local success,message=package.loadlib(table.concat({love.filesystem.getSaveDirectory(),CCloader_filename[system][1]},"/"),"luaopen_CCloader")
|
||||
return success,message
|
||||
end
|
||||
f=f()
|
||||
if f then break end
|
||||
end
|
||||
if not f then
|
||||
CCloader_filename[system]=nil
|
||||
return
|
||||
end
|
||||
f()
|
||||
BOT={
|
||||
getConf= cc.get_default_config ,--()options,weights
|
||||
--setConf= cc.set_options ,--(options,hold,20g,bag7)
|
||||
@@ -29,12 +50,12 @@ if system=="Windows"then
|
||||
addNext= cc.add_next_piece_async ,--(bot,piece)
|
||||
update= cc.reset_async ,--(bot,field,b2b,combo)
|
||||
think= cc.request_next_move ,--(bot)
|
||||
getMove= cc.poll_next_move ,--(bot)success,hold,move
|
||||
ifDead= cc.is_dead_async ,--(bot)dead
|
||||
getMove= cc.poll_next_move ,--(bot)success,dest,hold,move
|
||||
destroy= cc.destroy_async ,--(bot)
|
||||
|
||||
setHold= cc.set_hold ,--(opt,bool)
|
||||
set20G= cc.set_20g ,--(opt,bool)
|
||||
setPCLoop= cc.set_pcloop ,--(opt,bool)
|
||||
setBag= cc.set_bag7 ,--(opt,bool)
|
||||
setNode= cc.set_max_nodes ,--(opt,bool)
|
||||
free= cc.free ,--(opt/wei)
|
||||
@@ -66,7 +87,8 @@ if system=="Windows"then
|
||||
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
|
||||
end
|
||||
CC_updateField(P)
|
||||
P.hd={bk={{}},id=0,color=0,name=0}P.holded=false
|
||||
P.hd=nil
|
||||
P.holded=false
|
||||
P.cur=rem(P.next,1)
|
||||
P.sc,P.dir=scs[P.cur.id],0
|
||||
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
|
||||
@@ -80,6 +102,7 @@ if system=="Windows"then
|
||||
collectgarbage()
|
||||
end
|
||||
end
|
||||
loadCC()
|
||||
-------------------------------------------------9 Stack setup
|
||||
local dirCount={1,1,3,3,3,0,1}
|
||||
local spinOffset={
|
||||
@@ -218,7 +241,7 @@ return{
|
||||
end
|
||||
if not bn then goto CTN end
|
||||
|
||||
for dir=0,dirCount[bn] do--Each dir
|
||||
for dir=0,dirCount[bn]do--Each dir
|
||||
local cb=blocks[bn][dir]
|
||||
for cx=1,11-#cb[1]do--Each pos
|
||||
local cy=#Tfield+1
|
||||
@@ -282,9 +305,17 @@ return{
|
||||
return 2
|
||||
end,
|
||||
function(P,ctrl)--Poll keys
|
||||
if BOT.ifDead(P.AI_bot)then ins(ctrl,6)return 3 end
|
||||
local success,hold,move=BOT.getMove(P.AI_bot)
|
||||
if success then
|
||||
local success,dest,hold,move=BOT.getMove(P.AI_bot)
|
||||
if success==2 then
|
||||
ins(ctrl,6)
|
||||
return 3
|
||||
elseif success==0 then
|
||||
for i=1,#dest do
|
||||
for j=1,#dest[i]do
|
||||
dest[i][j]=dest[i][j]+1
|
||||
end
|
||||
end
|
||||
P.AI_dest=dest
|
||||
if hold then ctrl[1]=8 end--Hold
|
||||
while move[1]do
|
||||
local m=rem(move,1)
|
||||
|
||||
@@ -10,7 +10,7 @@ setting={
|
||||
reTime=4,
|
||||
autoPause=true,
|
||||
fine=false,
|
||||
lock=false,
|
||||
appLock=false,
|
||||
lang=1,
|
||||
skinSet=1,
|
||||
skin={1,5,8,2,10,3,7,1,5,1,5,8,2,10,3,7,10,7,8,2,8,2,1,5,3},
|
||||
@@ -21,7 +21,8 @@ setting={
|
||||
smooth=true,grid=false,
|
||||
bagLine=false,
|
||||
lockFX=2,
|
||||
dropFX=3,
|
||||
dropFX=2,
|
||||
moveFX=2,
|
||||
clearFX=2,
|
||||
shakeFX=2,
|
||||
atkFX=3,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local freeRow={}
|
||||
local L={}--Storage
|
||||
local _=0--Lenth
|
||||
local _=0--Length
|
||||
function freeRow.reset(num)
|
||||
if num<_ then
|
||||
for i=_,num+1,-1 do
|
||||
|
||||
@@ -164,6 +164,7 @@ function pasteSequence(str)
|
||||
end
|
||||
|
||||
preBag=bag
|
||||
sceneTemp.cur=#preBag
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -310,7 +311,6 @@ function resetGameData()
|
||||
|
||||
destroyPlayers()
|
||||
modeEnv=curMode.env
|
||||
math.randomseed(game.seed)
|
||||
curMode.load()--BG/BGM need redefine in custom,so up here
|
||||
if modeEnv.task then
|
||||
for i=1,#players do
|
||||
@@ -363,7 +363,6 @@ function resetPartGameData(replaying)
|
||||
|
||||
destroyPlayers()
|
||||
modeEnv=curMode.env
|
||||
math.randomseed(game.seed)
|
||||
curMode.load()
|
||||
if modeEnv.task then
|
||||
for i=1,#players do
|
||||
@@ -388,8 +387,8 @@ function gameStart()
|
||||
SFX.play("start")
|
||||
for P=1,#players do
|
||||
P=players[P]
|
||||
P:popNext()
|
||||
P.timing=true
|
||||
P.control=true
|
||||
P.timing=true
|
||||
P:popNext()
|
||||
end
|
||||
end
|
||||
@@ -15,7 +15,6 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"O spin Triple!",
|
||||
"nullpomino也很好玩!",
|
||||
"Naki 可爱!",
|
||||
"Miya:喵!",
|
||||
"Miya 可爱!",
|
||||
"Lua天下第一",
|
||||
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
|
||||
@@ -28,18 +27,28 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"e^(pi*i)=-1",
|
||||
"DT炮=TSD+TST炮",
|
||||
"Cultris II也很好玩!",
|
||||
"Ctrl+W=关闭当前标签页",
|
||||
"Ctrl+Tab=切换标签页",
|
||||
"Ctrl+F=查找",
|
||||
"Ctrl+D=复制一份",
|
||||
"Ctrl+Alt+Z=查看所有qq消息",
|
||||
"Ctrl+A=全选",
|
||||
"Ctrl+鼠标滚轮=缩放",
|
||||
"COOL!!",
|
||||
"CLASSIC SEXY RUSSIAN BLOCKS",
|
||||
"BT炮=beta炮",
|
||||
"backspace=返回上一个文件目录",
|
||||
"B2B2B2B存在吗?",
|
||||
"B2B2B???",
|
||||
"Am G F G",
|
||||
"Alt+Tab=切换窗口",
|
||||
"Alt+F4=关闭当前窗口",
|
||||
"ALLSPIN!",
|
||||
"注意到\"旋转\"到底对方块做了些什么吗?",
|
||||
"有疑问? 先看设置有没有你想要的",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"学会使用两个旋转键, 三个更好",
|
||||
"享受特色旋转系统!",
|
||||
"新人请千万记住,打好基础,不要太早学那些花里胡哨的",
|
||||
"享受Tech的特色旋转系统!",
|
||||
"无聊翻翻设置是好习惯",
|
||||
"我的世界好玩!",
|
||||
"提前旋转等设置可以用来救命",
|
||||
@@ -48,32 +57,32 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"使用love2d引擎制作",
|
||||
"少女祈祷中",
|
||||
"扫雷好玩!",
|
||||
"哦,我的上帝",
|
||||
"你可以长按R键重新开始游戏(也不是很长)",
|
||||
"你可以从统计页面打开游戏存档目录",
|
||||
"你好 世界!",
|
||||
"魔方好玩!",
|
||||
"喵!",
|
||||
"免费吃鸡方块",
|
||||
"秘密数字:626",
|
||||
"每个虚拟按键都可以隐藏/显示",
|
||||
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
|
||||
"每个块的出现方向可以自定义",
|
||||
"没专业美术,程序员审美警告",
|
||||
"没有专业美术的人,程序员审美警告",
|
||||
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
|
||||
"联网还没做呢, 别急",
|
||||
"键位是可以自定义的",
|
||||
"健康小贴士:玩游戏多眨眼,不然会干眼病",
|
||||
"健康小贴士:不要熬夜,真的会猝死",
|
||||
"合群了就会消失, 但是消失不代表没有意义",
|
||||
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
|
||||
"更小的DAS和ARR拥有更高的操作上限(前提是你能控制得了)",
|
||||
"俄罗斯方块环游记也不错!",
|
||||
"调到特殊的日期也不会发生什么的",
|
||||
"低帧率会降低游戏体验",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"大满贯10连击消四全清!",
|
||||
"打好块没有捷径,多练",
|
||||
"你可以长按R键重新开始游戏(也不是很长)",
|
||||
"茶娘 可爱!",
|
||||
"草(日本语)",
|
||||
"不要在上课时玩游戏!",
|
||||
"不要盯着bug不放",
|
||||
"不要按F10",
|
||||
"不是动画,真的在加载!",
|
||||
"别问游戏名怎么取的,问就是随便想的",
|
||||
"本游戏难度上限很高, 做好心理准备",
|
||||
@@ -90,6 +99,7 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"2.7182818284590452353",
|
||||
"15puzzle好玩!",
|
||||
"11renPC!",
|
||||
"100行内23PC来一个?",
|
||||
"1, 2, 9!!!!!",
|
||||
"<方块研究所>有一个Nspire-CX版本!",
|
||||
"↑↑↓↓←→←→BABA",
|
||||
@@ -106,13 +116,14 @@ elseif setting.lang==3 then
|
||||
"Who is diao",
|
||||
"What about 26 TSDs?",
|
||||
"What about 20 PCs?",
|
||||
"What about 23 PCs in 100 lines?",
|
||||
"Warning: Programmer Art",
|
||||
"Try to use two rotate button,three better",
|
||||
"This in not a casual game",
|
||||
"This game can be very hard,be mentally perpared",
|
||||
"Tetris journey has network battle!",
|
||||
"Terraria is fun!",
|
||||
"Tetralegends is fun!",
|
||||
"Terraria is fun!",
|
||||
"Techmino=Technique+Tetromino",
|
||||
"Techmino is so fun!",
|
||||
"Techmino has a Nspire-CX edition!",
|
||||
@@ -140,10 +151,10 @@ elseif setting.lang==3 then
|
||||
"l-=-1",
|
||||
"Is B2B2B2B possible?",
|
||||
"Initial Rotation etc. can save your life",
|
||||
"Hold R key to restart game",
|
||||
"Hello world!",
|
||||
"Headphones for better experience",
|
||||
"Have you noticed what does \"rotating\" do to block?",
|
||||
"Hold R key to restart game",
|
||||
"Find out what's in the setting!",
|
||||
"Enjoy Tech. Rotation System!",
|
||||
"e^(pi*i/2)=i",
|
||||
@@ -155,8 +166,7 @@ elseif setting.lang==3 then
|
||||
"Disappearing doesn't mean useless",
|
||||
"Diao so bully",
|
||||
"COOL!!",
|
||||
"CLASSIC SEXY RUSSIAN BLOCKS",
|
||||
"BT cannon=beta",
|
||||
"BT cannon=beta cannon",
|
||||
"Back to Back 10 combo Techrash PC!",
|
||||
"B2B2B???",
|
||||
"Any suggestions to author!",
|
||||
@@ -164,9 +174,9 @@ elseif setting.lang==3 then
|
||||
"Also try VVVVVV!",
|
||||
"Also try Tetr.js!",
|
||||
"Also try Tetr.io!",
|
||||
"Also try Nullpomino!",
|
||||
"Also try Jstris!",
|
||||
"Also try Cultris II!",
|
||||
"Also try Nullpomino!",
|
||||
"ALLSPIN!",
|
||||
"少女祈禱中",
|
||||
"40L WR: 15.654s",
|
||||
@@ -223,7 +233,7 @@ elseif setting.lang==5 then
|
||||
--[[23]]"大半夜的在这干啥呢?不睡觉是会猝死的",
|
||||
}
|
||||
return time[tonumber(os.date("%H"))+1]
|
||||
elseif true or R<.1 then
|
||||
elseif R<.1 then
|
||||
local int=math.floor
|
||||
L={
|
||||
"平均"..int(stat.row/stat.time*60).."LPM,那可真强呢",
|
||||
@@ -243,8 +253,10 @@ elseif setting.lang==5 then
|
||||
"我一个滑铲就挖了个11renPC",
|
||||
"我曾经在极度愤怒的时候15秒消了40行",
|
||||
"天天F3F3,怕别人不知道你菜?",
|
||||
"天天卖弱,你一定把把150apm吧?",
|
||||
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
|
||||
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
|
||||
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
|
||||
"人只用一只手都能玩,你呢?",
|
||||
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
|
||||
"满口PCDT信天翁,还会点别的么?",
|
||||
@@ -253,6 +265,7 @@ elseif setting.lang==5 then
|
||||
"还搁这玩手机呢,作业做完了?",
|
||||
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
|
||||
"不会吧不会吧,真的还有人不能随手Tspin?",
|
||||
"别会个c4w就以为自己多强,这是基本功罢了",
|
||||
"60lpm?拍硬降刷的吧",
|
||||
"4pps不是人均水平?",
|
||||
"40行还要40多秒,就这?",
|
||||
@@ -260,9 +273,8 @@ elseif setting.lang==5 then
|
||||
"20连pc不是随手?",
|
||||
"100apm?定式刷的吧",
|
||||
"0202年了,还在玩这种小孩子玩的游戏?",
|
||||
"天天卖弱,你一定把把150apm吧?",
|
||||
"别会个c4w就以为自己多强,这是基本功罢了",
|
||||
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
|
||||
"极限20G?那不是随手通",
|
||||
"全隐40行全消四很难吗??",
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -84,14 +84,14 @@ local TRS={
|
||||
},--Z
|
||||
{},--S
|
||||
{
|
||||
[01]={{-1, 0},{-1, 1},{ 0,-2},{ 1, 1}},
|
||||
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
|
||||
[01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}},
|
||||
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}},
|
||||
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}},
|
||||
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}},
|
||||
[12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}},
|
||||
[21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}},
|
||||
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}},
|
||||
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2}},
|
||||
[21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}},
|
||||
[32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}},
|
||||
[23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
|
||||
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
|
||||
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
|
||||
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
|
||||
@@ -114,13 +114,15 @@ local TRS={
|
||||
},--T
|
||||
function(P,d)
|
||||
if P.human then SFX.fieldPlay("rotate",nil,P)end
|
||||
P:freshLockDelay()
|
||||
if not P.gameEnv.ospin then return end
|
||||
local x,y=P.curX,P.curY
|
||||
if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then
|
||||
local D=P.spinSeq%100*10+d
|
||||
P.spinSeq=D
|
||||
if D<100 then return end
|
||||
if D<100 then
|
||||
P:freshBlock(true,true)
|
||||
return
|
||||
end
|
||||
for i=1,#OspinList do
|
||||
local L=OspinList[i]
|
||||
if D==L[1]then
|
||||
@@ -136,7 +138,7 @@ local TRS={
|
||||
P.dir,P.sc=dir,scs[id][dir]
|
||||
P.spinLast=2
|
||||
P.stat.rotate=P.stat.rotate+1
|
||||
P:freshgho()
|
||||
P:freshBlock(false,true)
|
||||
P.spinSeq=0
|
||||
SFX.fieldPlay("rotatekick",nil,P)
|
||||
return
|
||||
@@ -145,17 +147,18 @@ local TRS={
|
||||
end
|
||||
else
|
||||
P.spinSeq=0
|
||||
P:freshBlock(true,true)
|
||||
end
|
||||
end,--O
|
||||
{
|
||||
[01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}},
|
||||
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 2}},
|
||||
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
|
||||
[03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}},
|
||||
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 2}},
|
||||
[12]={{-1, 0},{ 2, 0},{ 0,-1},{-1, 2},{ 2,-1}},
|
||||
[21]={{-2, 0},{ 1, 0},{ 0, 1},{ 1,-2},{-2, 1}},
|
||||
[32]={{ 1, 0},{-2, 0},{ 0,-1},{ 1, 2},{-2,-1}},
|
||||
[23]={{ 2, 0},{-1, 0},{ 0, 1},{-1,-2},{ 2, 1}},
|
||||
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
|
||||
[12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}},
|
||||
[21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
|
||||
[32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}},
|
||||
[23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
|
||||
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
|
||||
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
|
||||
[13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}},
|
||||
@@ -213,10 +216,10 @@ local TRS={
|
||||
[31]={{-1, 0},{ 1, 1},{ 2, 0}},
|
||||
},--T5
|
||||
{
|
||||
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-3}},
|
||||
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 3}},
|
||||
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-3}},
|
||||
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2},{-1, 3}},
|
||||
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}},
|
||||
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
|
||||
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
|
||||
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}},
|
||||
[12]={{ 1, 0},{ 1,-1},{ 1, 1}},
|
||||
[21]={{-1,-1},{-1, 1},{-1,-1}},
|
||||
[32]={{-1, 0},{-1,-1},{-1, 1}},
|
||||
@@ -230,7 +233,7 @@ local TRS={
|
||||
[01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}},
|
||||
[10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}},
|
||||
[03]={{ 0,-1},{ 0, 1},{ 0, 2}},
|
||||
[30]={{ 0,-1},{ 0,-1},{ 0,-2}},
|
||||
[30]={{ 0,-1},{ 0, 1},{ 0,-2}},
|
||||
[12]={{ 0,-1},{ 0, 1}},
|
||||
[21]={{ 0,-1},{ 0,-2}},
|
||||
[32]={{ 1, 0},{-1, 0}},
|
||||
@@ -256,18 +259,18 @@ local TRS={
|
||||
},--W
|
||||
function(P,d)
|
||||
if P.human then SFX.fieldPlay("rotate",nil,P)end
|
||||
P:freshLockDelay()
|
||||
local iki=XspinList[d]
|
||||
for test=1,#iki do
|
||||
local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
|
||||
if not P:ifoverlap(P.cur.bk,x,y)then
|
||||
P.curX,P.curY=x,y
|
||||
P.spinLast=1
|
||||
P:freshgho()
|
||||
P:freshBlock(false,true)
|
||||
P.stat.rotate=P.stat.rotate+1
|
||||
return
|
||||
end
|
||||
end
|
||||
P:freshBlock(true,true)
|
||||
end,--X
|
||||
{
|
||||
[01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}},
|
||||
@@ -285,14 +288,14 @@ local TRS={
|
||||
},--J5
|
||||
{},--L5
|
||||
{
|
||||
[01]={{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}},
|
||||
[10]={{-1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}},
|
||||
[03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
|
||||
[30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
|
||||
[01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}},
|
||||
[10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}},
|
||||
[03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
|
||||
[30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
|
||||
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}},
|
||||
[21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}},
|
||||
[32]={{-1, 0},{ 0,-1},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}},
|
||||
[23]={{ 1, 0},{ 0, 1},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}},
|
||||
[32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}},
|
||||
[23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}},
|
||||
[02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}},
|
||||
[20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}},
|
||||
[13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}},
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
local sin,cos=math.sin,math.cos
|
||||
snapLevelValue={1,10,20,40,60,80}
|
||||
title={
|
||||
{
|
||||
@@ -114,6 +115,12 @@ title={
|
||||
5878, 463,
|
||||
},
|
||||
}
|
||||
for _,C in next,title do
|
||||
for i=1,#C do
|
||||
C[i]=C[i]*.1626
|
||||
end
|
||||
end
|
||||
--[[
|
||||
title2={}
|
||||
for i=1,#title do title2[i]=title[i]end
|
||||
title2[5]={
|
||||
@@ -140,12 +147,22 @@ title2[5]={
|
||||
3001, 1280,
|
||||
2779, 1280,
|
||||
}
|
||||
|
||||
for _,C in next,title do
|
||||
for i=1,#C do
|
||||
C[i]=C[i]*.1626
|
||||
]]
|
||||
title_fan={}
|
||||
for i=1,8 do
|
||||
local L={}
|
||||
title_fan[i]=L
|
||||
for j=1,#title[i]do
|
||||
L[j]=title[i][j]
|
||||
end
|
||||
for j=1,#L,2 do
|
||||
local x,y=L[j],L[j+1]--0<x<3041, 290<y<1280
|
||||
x,y=-(x+240+y*.3)*.002,(y-580)*.9
|
||||
x,y=y*cos(x),-y*sin(x)--Rec-Pol-Rec
|
||||
L[j],L[j+1]=x,y+300
|
||||
end
|
||||
end
|
||||
|
||||
customID={
|
||||
"drop","lock",
|
||||
"wait","fall",
|
||||
@@ -168,7 +185,7 @@ customRange={
|
||||
target={10,20,40,100,200,500,1000,1e99},
|
||||
freshLimit={0,8,15,1e99},
|
||||
opponent={0,1,2,3,4,5,11,12,13,14,15,16},
|
||||
bg={"none","game1","game2","game3","aura","rgb","glow","matrix"},
|
||||
bg={"none","bg1","bg2","rainbow","aura","rgb","glow","matrix"},
|
||||
bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"},
|
||||
}
|
||||
local function T(s,t)return love.graphics.newText(setFont(s),t)end
|
||||
|
||||
434
parts/player.lua
434
parts/player.lua
@@ -18,8 +18,11 @@ local gameEnv0={
|
||||
smooth=false,grid=false,
|
||||
bagLine=false,
|
||||
text=true,
|
||||
lockFX=2,dropFX=3,
|
||||
clearFX=2,shakeFX=3,
|
||||
lockFX=2,
|
||||
dropFX=2,
|
||||
moveFX=2,
|
||||
clearFX=2,
|
||||
shakeFX=3,
|
||||
|
||||
drop=60,lock=60,
|
||||
wait=0,fall=0,
|
||||
@@ -84,7 +87,7 @@ local finesseList={
|
||||
finesseList[1][3],finesseList[1][4],finesseList[7][3],finesseList[7][4]=finesseList[1][1],finesseList[1][2],finesseList[7][1],finesseList[7][2]--"2-phase" SZI
|
||||
finesseList[2]=finesseList[1]--S=Z
|
||||
finesseList[4],finesseList[5]=finesseList[3],finesseList[3]--J=L=T
|
||||
local CCblockID={4,3,6,5,1,2,0}
|
||||
local CCblockID={6,5,4,3,2,1,0}
|
||||
local freshPrepare={
|
||||
none=NULL,
|
||||
bag=function(P)
|
||||
@@ -243,12 +246,21 @@ local function updateFXs(P,dt)
|
||||
--DropFX
|
||||
for i=#P.dropFX,1,-1 do
|
||||
local S=P.dropFX[i]
|
||||
S[6]=S[6]+S[7]*dt
|
||||
if S[6]>1 then
|
||||
S[5]=S[5]+S[6]*dt
|
||||
if S[5]>1 then
|
||||
rem(P.dropFX,i)
|
||||
end
|
||||
end
|
||||
|
||||
--MoveFX
|
||||
for i=#P.moveFX,1,-1 do
|
||||
local S=P.moveFX[i]
|
||||
S[4]=S[4]+S[5]*dt
|
||||
if S[4]>1 then
|
||||
rem(P.moveFX,i)
|
||||
end
|
||||
end
|
||||
|
||||
--ClearFX
|
||||
for i=#P.clearFX,1,-1 do
|
||||
local S=P.clearFX[i]
|
||||
@@ -410,15 +422,15 @@ local function Pupdate_alive(P,dt)
|
||||
|
||||
--Try spawn new block
|
||||
if not P.control then goto stop end
|
||||
if P.waiting==0 then P:popNext()end
|
||||
if P.waiting>=0 then
|
||||
P.waiting=P.waiting-1
|
||||
if P.waiting<0 then P:popNext()end
|
||||
goto stop
|
||||
end
|
||||
|
||||
--Natural block falling
|
||||
if P.cur then
|
||||
if P.curY~=P.imgY then
|
||||
if P.curY>P.imgY then
|
||||
local D=P.dropDelay
|
||||
if D>1 then
|
||||
P.dropDelay=D-1
|
||||
@@ -426,18 +438,24 @@ local function Pupdate_alive(P,dt)
|
||||
end
|
||||
|
||||
if D==1 then
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("down")
|
||||
end
|
||||
P.curY=P.curY-1
|
||||
else
|
||||
local _=P.curY-P.imgY--Max fall dist
|
||||
D=1/D--Fall dist
|
||||
if D<_ then
|
||||
P.curY=P.curY-D
|
||||
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
|
||||
if D>P.curY-P.imgY then D=P.curY-P.imgY end
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
for i=1,D do
|
||||
P:createMoveFX("down")
|
||||
P.curY=P.curY-1
|
||||
end
|
||||
else
|
||||
P.curY=P.imgY
|
||||
P.curY=P.curY-D
|
||||
end
|
||||
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
|
||||
end
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
P.spinLast=false
|
||||
|
||||
if P.imgY~=P.curY then
|
||||
@@ -533,25 +551,29 @@ end
|
||||
local function drawFXs(P)
|
||||
--LockFX
|
||||
for i=1,#P.lockFX do
|
||||
_=P.lockFX[i]
|
||||
if _[3]<.5 then
|
||||
gc.setColor(1,1,1,2*_[3])
|
||||
gc.rectangle("fill",_[1],_[2],60*_[3],30)
|
||||
local S=P.lockFX[i]
|
||||
if S[3]<.5 then
|
||||
gc.setColor(1,1,1,2*S[3])
|
||||
gc.rectangle("fill",S[1],S[2],60*S[3],30)
|
||||
else
|
||||
gc.setColor(1,1,1,2-2*_[3])
|
||||
gc.rectangle("fill",_[1]+30,_[2],60*_[3]-60,30)
|
||||
gc.setColor(1,1,1,2-2*S[3])
|
||||
gc.rectangle("fill",S[1]+30,S[2],60*S[3]-60,30)
|
||||
end
|
||||
end
|
||||
|
||||
--DropFX
|
||||
for i=1,#P.dropFX do
|
||||
_=P.dropFX[i]
|
||||
gc.setColor(1,1,1,.6-_[6]*.6)
|
||||
for x=_[2],_[4]do
|
||||
for y=_[5],_[3]do
|
||||
drawPixel(y,x,_[1])
|
||||
end
|
||||
end
|
||||
local S=P.dropFX[i]
|
||||
gc.setColor(1,1,1,.6-S[5]*.6)
|
||||
local w=30*S[3]*(1-S[5]*.5)
|
||||
gc.rectangle("fill",30*S[1]-30+15*S[3]-w*.5,600-30*S[2],w,30*S[4])
|
||||
end
|
||||
|
||||
--MoveFX
|
||||
for i=1,#P.moveFX do
|
||||
local S=P.moveFX[i]
|
||||
gc.setColor(1,1,1,.6-S[4]*.6)
|
||||
drawPixel(S[3],S[2],S[1])
|
||||
end
|
||||
|
||||
--ClearFX
|
||||
@@ -636,7 +658,7 @@ local function Pdraw_norm(P)
|
||||
end end
|
||||
end
|
||||
|
||||
local dy=P.gameEnv.smooth and P.imgY~=P.curY and (min(P.dropDelay,1e99)/P.gameEnv.drop-1)*30 or 0
|
||||
local dy=P.gameEnv.smooth and P.imgY~=P.curY and(P.dropDelay/P.gameEnv.drop-1)*30 or 0
|
||||
gc.translate(0,-dy)
|
||||
local trans=P.lockDelay/P.gameEnv.lock
|
||||
if P.gameEnv.block then
|
||||
@@ -680,13 +702,18 @@ local function Pdraw_norm(P)
|
||||
::E::
|
||||
gc.setScissor()
|
||||
gc.translate(0,-P.fieldBeneath)
|
||||
gc.setColor(1,1,1)
|
||||
gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
|
||||
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
|
||||
gc.setColor(P.frameColor)
|
||||
gc.rectangle("line",-1,-11,302,612)--Boarder
|
||||
gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
|
||||
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
|
||||
|
||||
|
||||
--LockDelay indicator
|
||||
if P.gameEnv.easyFresh then
|
||||
gc.setColor(1,1,1)
|
||||
else
|
||||
gc.setColor(1,.26,.26)
|
||||
end
|
||||
if P.lockDelay>=0 then
|
||||
gc.rectangle("fill",0,602,300*P.lockDelay/P.gameEnv.lock,6)--Lock delay indicator
|
||||
end
|
||||
@@ -811,6 +838,12 @@ local function Pdraw_norm(P)
|
||||
mStr(format("%.2f",P.stat.time),-81,518)--Time
|
||||
mStr(P.score1,-81,560)--Score
|
||||
|
||||
--Display Ys
|
||||
-- gc.setLineWidth(6)
|
||||
-- if P.curY then gc.setColor(1,.4,0,.626)gc.line(0,611-P.curY*30,300,611-P.curY*30)end
|
||||
-- if P.imgY then gc.setColor(0,1,.4,.626)gc.line(0,615-P.imgY*30,300,615-P.imgY*30)end
|
||||
-- if P.minY then gc.setColor(0,.4,1,.626)gc.line(0,619-P.minY*30,300,619-P.minY*30)end
|
||||
|
||||
--Other messages
|
||||
gc.setColor(1,1,1)
|
||||
curMode.mesDisp(P)
|
||||
@@ -979,11 +1012,11 @@ end
|
||||
--------------------------<FX>--------------------------
|
||||
function player.showText(P,text,dx,dy,font,style,spd,stop)
|
||||
if P.gameEnv.text then
|
||||
P.bonus[#P.bonus+1]=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
|
||||
function player.showTextF(P,text,dx,dy,font,style,spd,stop)
|
||||
P.bonus[#P.bonus+1]=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
|
||||
local function without(L,e)
|
||||
for i=1,#L do
|
||||
@@ -993,7 +1026,7 @@ local function without(L,e)
|
||||
end
|
||||
function player.createLockFX(P)
|
||||
local BK=P.cur.bk
|
||||
local t=12-P.gameEnv.lockFX*3
|
||||
local t=12-P.gameEnv.lockFX*2
|
||||
|
||||
for i=1,P.r do
|
||||
local y=P.curY+i-1
|
||||
@@ -1007,9 +1040,49 @@ function player.createLockFX(P)
|
||||
end
|
||||
end
|
||||
end
|
||||
function player.createDropFX(P,x1,y1,x2,y2)--x1<x2,y1>y2!
|
||||
if P.gameEnv.block and y1>=y2 then
|
||||
P.dropFX[#P.dropFX+1]={P.cur.color,x1,y1,x2,y2,0,12-2*P.gameEnv.dropFX}
|
||||
function player.creatDropFX(P,x,y,w,h)--TODO, remake dropFX
|
||||
ins(P.dropFX,{x,y,w,h,0,13-2*P.gameEnv.dropFX})
|
||||
end
|
||||
function player.createMoveFX(P,dir)
|
||||
local T=10-1.5*P.gameEnv.moveFX
|
||||
local C=P.cur.color
|
||||
local x=P.curX-1
|
||||
local y=P.gameEnv.smooth and P.curY+P.dropDelay/P.gameEnv.drop-2 or P.curY-1
|
||||
if dir=="left"then
|
||||
for i=1,P.r do
|
||||
for j=P.c,1,-1 do
|
||||
if P.cur.bk[i][j]then
|
||||
ins(P.moveFX,{C,x+j,y+i,0,T})
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif dir=="right"then
|
||||
for i=1,P.r do
|
||||
for j=1,P.c do
|
||||
if P.cur.bk[i][j]then
|
||||
ins(P.moveFX,{C,x+j,y+i,0,T})
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif dir=="down"then
|
||||
for j=1,P.c do
|
||||
for i=P.r,1,-1 do
|
||||
if P.cur.bk[i][j]then
|
||||
ins(P.moveFX,{C,x+j,y+i,0,T})
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
for i=1,P.r do
|
||||
for j=1,P.c do
|
||||
if P.cur.bk[i][j]then
|
||||
ins(P.moveFX,{C,x+j,y+i,0,T})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
|
||||
@@ -1063,7 +1136,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
|
||||
radius=radius*.4
|
||||
a=.35
|
||||
end
|
||||
FX_attack[#FX_attack+1]={
|
||||
ins(FX_attack,{
|
||||
x=x1,y=y1,--Current pos
|
||||
x1=x1,y1=y1,--Start pos
|
||||
x2=x2,y2=y2,--End pos
|
||||
@@ -1073,14 +1146,14 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
|
||||
r=r,g=g,b=b,a=a*(setting.atkFX+5)*.1,
|
||||
t=0,
|
||||
drag={},--Afterimage coordinate list
|
||||
}
|
||||
})
|
||||
end
|
||||
function player.newTask(P,code,data)
|
||||
local L=P.tasks
|
||||
L[#L+1]={
|
||||
ins(L,{
|
||||
code=code,
|
||||
data=data,
|
||||
}
|
||||
})
|
||||
end
|
||||
--------------------------</FX>--------------------------
|
||||
|
||||
@@ -1215,7 +1288,7 @@ function player.garbageRise(P,color,amount,pos)
|
||||
_=P.dropFX[i]
|
||||
_[3],_[5]=_[3]+amount,_[5]+amount
|
||||
end
|
||||
if #P.field>40 then P:lose()end
|
||||
if #P.field>42 then P:lose()end
|
||||
end
|
||||
|
||||
local invList={2,1,4,3,5,6,7}
|
||||
@@ -1238,7 +1311,7 @@ function player.pushLine(P,L,mir)
|
||||
P.fieldBeneath=P.fieldBeneath+120
|
||||
P.curY=P.curY+#L
|
||||
P.imgY=P.imgY+#L
|
||||
P:freshgho()
|
||||
P:freshBlock(false,false)
|
||||
end
|
||||
function player.pushNext(P,L,mir)
|
||||
for i=1,#L do
|
||||
@@ -1288,67 +1361,74 @@ function player.changeAtk(P,R)
|
||||
end
|
||||
if R then
|
||||
P.atking=R
|
||||
R.atker[#R.atker+1]=P
|
||||
ins(R.atker,P)
|
||||
else
|
||||
P.atking=nil
|
||||
end
|
||||
end
|
||||
function player.freshgho(P)
|
||||
if not P.cur then return end
|
||||
P.imgY=min(#P.field+1,P.curY)
|
||||
function player.freshBlock(P,keepGhost,control,system)
|
||||
if not keepGhost and P.cur then
|
||||
P.imgY=min(#P.field+1,P.curY)
|
||||
if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then
|
||||
local _=P.imgY
|
||||
|
||||
if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then
|
||||
local _=P.imgY
|
||||
|
||||
--Move ghost to bottom
|
||||
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
|
||||
P.imgY=P.imgY-1
|
||||
end
|
||||
|
||||
--Cancel spinLast
|
||||
if _~=P.imgY then
|
||||
P.spinLast=false
|
||||
end
|
||||
|
||||
--Create FX if dropped
|
||||
if P.curY>P.imgY then
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
|
||||
--Move ghost to bottom
|
||||
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
|
||||
P.imgY=P.imgY-1
|
||||
end
|
||||
if P.gameEnv.shakeFX then
|
||||
P.fieldOff.vy=P.gameEnv.shakeFX*.5
|
||||
|
||||
--Cancel spinLast
|
||||
if _~=P.imgY then
|
||||
P.spinLast=false
|
||||
end
|
||||
|
||||
--Create FX if dropped
|
||||
if P.curY>P.imgY then
|
||||
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
|
||||
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
|
||||
end
|
||||
if P.gameEnv.shakeFX then
|
||||
P.fieldOff.vy=P.gameEnv.shakeFX*.5
|
||||
end
|
||||
P.curY=P.imgY
|
||||
end
|
||||
else
|
||||
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
|
||||
P.imgY=P.imgY-1
|
||||
end
|
||||
P.curY=P.imgY
|
||||
end
|
||||
else
|
||||
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
|
||||
P.imgY=P.imgY-1
|
||||
end
|
||||
end
|
||||
end
|
||||
function player.freshLockDelay(P)
|
||||
--Return when fall-fresh but no fall
|
||||
if not P.gameEnv.easyFresh and P.curY>=P.minY then
|
||||
return
|
||||
end
|
||||
|
||||
local d,d0=P.lockDelay,P.gameEnv.lock
|
||||
if d<d0 and(P.freshTime<P.gameEnv.freshLimit or P.curY<P.minY)then
|
||||
if P.lockDelay<P.gameEnv.lock then
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
if control then
|
||||
if P.gameEnv.easyFresh then
|
||||
local d0=P.gameEnv.lock
|
||||
if P.lockDelay<d0 and P.freshTime<P.gameEnv.freshLimit then
|
||||
if not system then
|
||||
P.freshTime=P.freshTime+1
|
||||
end
|
||||
P.lockDelay=d0
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
end
|
||||
if P.curY<P.minY then
|
||||
P.minY=P.curY
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
end
|
||||
else
|
||||
if P.curY<P.minY then
|
||||
P.minY=P.curY
|
||||
if P.lockDelay<P.gameEnv.lock and P.freshTime<P.gameEnv.freshLimit then
|
||||
P.freshTime=P.freshTime+1
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
end
|
||||
end
|
||||
end
|
||||
P.freshTime=P.freshTime+1
|
||||
P.lockDelay=min(d+d0*.6,d0)
|
||||
end
|
||||
end
|
||||
function player.freshMinY(P)
|
||||
if P.curY<P.minY then
|
||||
P.freshTime=max(P.freshTime-1,0)
|
||||
P.minY=P.curY
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
end
|
||||
end
|
||||
function player.lock(P)
|
||||
local dest=P.AI_dest
|
||||
local has_dest=dest~=nil
|
||||
for i=1,P.r do
|
||||
local y=P.curY+i-1
|
||||
if not P.field[y]then P.field[y],P.visTime[y]=freeRow.get(0),freeRow.get(0)end
|
||||
@@ -1356,9 +1436,25 @@ function player.lock(P)
|
||||
if P.cur.bk[i][j]then
|
||||
P.field[y][P.curX+j-1]=P.cur.color
|
||||
P.visTime[y][P.curX+j-1]=P.showTime
|
||||
local x=P.curX+j-1
|
||||
if dest then
|
||||
local original_length=#dest
|
||||
for k=1,original_length do
|
||||
if x==dest[k][1]and y==dest[k][2]then
|
||||
rem(dest, k)
|
||||
break
|
||||
end
|
||||
end
|
||||
if #dest~=original_length-1 then
|
||||
dest=nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if has_dest and not dest then
|
||||
CC_updateField(P)
|
||||
end
|
||||
end
|
||||
function player.spin(P,d,ifpre)
|
||||
local iki=P.RS[P.cur.id]
|
||||
@@ -1370,7 +1466,9 @@ function player.spin(P,d,ifpre)
|
||||
local ix,iy=P.curX+P.sc[2]-isc[2],P.curY+P.sc[1]-isc[1]
|
||||
iki=iki[P.dir*10+idir]
|
||||
if not iki then
|
||||
if P.gameEnv.easyFresh then P:freshLockDelay()end
|
||||
if P.gameEnv.easyFresh then
|
||||
P:freshBlock(false,true)
|
||||
end
|
||||
SFX.fieldPlay(ifpre and"prerotate"or "rotate",nil,P)
|
||||
return
|
||||
end
|
||||
@@ -1378,17 +1476,17 @@ function player.spin(P,d,ifpre)
|
||||
local x,y=ix+iki[test][1],iy+iki[test][2]
|
||||
if not P:ifoverlap(icb,x,y)and(P.freshTime<=P.gameEnv.freshLimit or iki[test][2]<0)then
|
||||
ix,iy=x,y
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX()
|
||||
end
|
||||
P.curX,P.curY,P.dir=ix,iy,idir
|
||||
P.sc,P.cur.bk=scs[P.cur.id][idir],icb
|
||||
P.r,P.c=ir,ic
|
||||
P.spinLast=test==2 and 0 or 1
|
||||
if not ifpre then P:freshgho()end
|
||||
P:freshLockDelay()
|
||||
P:freshMinY()
|
||||
if iki[test][2]>0 then
|
||||
if not ifpre then
|
||||
P:freshBlock(false,true)
|
||||
end
|
||||
if iki[test][2]>0 and not P.gameEnv.easyFresh then
|
||||
P.freshTime=P.freshTime+1
|
||||
end
|
||||
|
||||
@@ -1487,8 +1585,10 @@ function player.hold(P,ifpre)
|
||||
end
|
||||
if C then
|
||||
P:resetBlock()
|
||||
P:freshgho()
|
||||
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0)
|
||||
P:freshBlock(false,true)
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
P.freshTime=max(P.freshTime-5,0)
|
||||
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
|
||||
end
|
||||
|
||||
@@ -1501,7 +1601,7 @@ end
|
||||
|
||||
function player.getNext(P,n)
|
||||
local E=P.gameEnv
|
||||
P.next[#P.next+1]={bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n}
|
||||
ins(P.next,{bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n})
|
||||
end
|
||||
function player.popNext(P)--Pop next queue to hand
|
||||
P.holded=false
|
||||
@@ -1519,7 +1619,7 @@ function player.popNext(P)--Pop next queue to hand
|
||||
BOT.addNext(P.AI_bot,CCblockID[next.id])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local _=P.keyPressing
|
||||
--IHS
|
||||
if _[8]and P.gameEnv.hold and P.gameEnv.ihs then
|
||||
@@ -1529,15 +1629,23 @@ function player.popNext(P)--Pop next queue to hand
|
||||
P:resetBlock()
|
||||
end
|
||||
|
||||
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
P.freshTime=0
|
||||
|
||||
if P.cur then
|
||||
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
|
||||
P:freshgho()
|
||||
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then
|
||||
P:lock()
|
||||
P:lose()
|
||||
end
|
||||
P:freshBlock(false,true,true)
|
||||
end
|
||||
|
||||
--IHdS
|
||||
if _[6]then P.act.hardDrop(P)_[6]=false end
|
||||
if _[6]then
|
||||
P.act.hardDrop(P)
|
||||
_[6]=false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1624,7 +1732,7 @@ function player.drop(P)--Place piece
|
||||
--Create clearing FX
|
||||
if cc>0 and P.gameEnv.clearFX then
|
||||
local l=P.clearedRow
|
||||
local t=6-P.gameEnv.clearFX*1.5
|
||||
local t=7-P.gameEnv.clearFX*1
|
||||
for i=1,cc do
|
||||
ins(P.clearFX,{l[i],0,t})
|
||||
end
|
||||
@@ -1634,8 +1742,13 @@ function player.drop(P)--Place piece
|
||||
if P.gameEnv.lockFX then
|
||||
if cc==0 then
|
||||
P:createLockFX()
|
||||
elseif P.lockFX[1]then
|
||||
P.lockFX={}
|
||||
else
|
||||
_=#P.lockFX
|
||||
if _>0 then
|
||||
for i=1,_ do
|
||||
rem(P.lockFX)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1942,7 +2055,7 @@ function player.drop(P)--Place piece
|
||||
if P.dropSpeed>60 then
|
||||
dropScore=dropScore*P.dropSpeed/60
|
||||
elseif P.dropSpeed>120 then
|
||||
dropScore=dropScore*1,2*P.dropSpeed/120
|
||||
dropScore=dropScore*1.2*P.dropSpeed/120
|
||||
elseif P.dropSpeed>180 then
|
||||
dropScore=dropScore*1.5*P.dropSpeed/180
|
||||
end
|
||||
@@ -2237,9 +2350,11 @@ function player.act.moveLeft(P,auto)
|
||||
end
|
||||
elseif P.control and P.waiting==-1 then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("left")
|
||||
end
|
||||
P.curX=P.curX-1
|
||||
P:freshgho()
|
||||
P:freshLockDelay()
|
||||
P:freshBlock(false,true)
|
||||
if P.human and P.curY==P.imgY then SFX.play("move")end
|
||||
if not auto then P.moving=0 end
|
||||
P.spinLast=false
|
||||
@@ -2262,9 +2377,11 @@ function player.act.moveRight(P,auto)
|
||||
end
|
||||
elseif P.control and P.waiting==-1 then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("right")
|
||||
end
|
||||
P.curX=P.curX+1
|
||||
P:freshgho()
|
||||
P:freshLockDelay()
|
||||
P:freshBlock(false,true)
|
||||
if P.human and P.curY==P.imgY then SFX.play("move")end
|
||||
if not auto then P.moving=0 end
|
||||
P.spinLast=false
|
||||
@@ -2303,9 +2420,9 @@ function player.act.hardDrop(P)
|
||||
end
|
||||
P.keyPressing[6]=false
|
||||
elseif P.control and P.waiting==-1 and P.cur then
|
||||
if P.curY~=P.imgY then
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
|
||||
if P.curY>P.imgY then
|
||||
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
|
||||
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
|
||||
end
|
||||
P.curY=P.imgY
|
||||
P.spinLast=false
|
||||
@@ -2330,9 +2447,9 @@ function player.act.softDrop(P)
|
||||
else
|
||||
P.downing=1
|
||||
if P.control and P.waiting==-1 and P.cur then
|
||||
if P.curY~=P.imgY then
|
||||
if P.curY>P.imgY then
|
||||
P.curY=P.curY-1
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
P.spinLast=false
|
||||
end
|
||||
end
|
||||
@@ -2356,14 +2473,13 @@ function player.act.insLeft(P,auto)
|
||||
if P.gameEnv.nofly or not P.cur then return end
|
||||
local x0=P.curX
|
||||
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
|
||||
P.curX=P.curX-1
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("left")
|
||||
end
|
||||
P:freshgho()
|
||||
P.curX=P.curX-1
|
||||
P:freshBlock(false,true)
|
||||
end
|
||||
if P.curX~=x0 then
|
||||
P:freshLockDelay()
|
||||
P.spinLast=false
|
||||
end
|
||||
if P.gameEnv.shakeFX then
|
||||
@@ -2379,14 +2495,13 @@ function player.act.insRight(P,auto)
|
||||
if P.gameEnv.nofly or not P.cur then return end
|
||||
local x0=P.curX
|
||||
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
|
||||
P.curX=P.curX+1
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("right")
|
||||
end
|
||||
P:freshgho()
|
||||
P.curX=P.curX+1
|
||||
P:freshBlock(false,true)
|
||||
end
|
||||
if P.curX~=x0 then
|
||||
P:freshLockDelay()
|
||||
P.spinLast=false
|
||||
end
|
||||
if P.gameEnv.shakeFX then
|
||||
@@ -2399,29 +2514,32 @@ function player.act.insRight(P,auto)
|
||||
end
|
||||
end
|
||||
function player.act.insDown(P)
|
||||
if P.curY~=P.imgY and P.cur then
|
||||
if P.gameEnv.dropFX then
|
||||
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
|
||||
if P.curY>P.imgY and P.cur then
|
||||
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
|
||||
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
|
||||
end
|
||||
if P.gameEnv.shakeFX then
|
||||
P.fieldOff.vy=P.gameEnv.shakeFX*.5
|
||||
end
|
||||
P.curY,P.lockDelay,P.spinLast=P.imgY,P.gameEnv.lock,false
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
end
|
||||
end
|
||||
function player.act.down1(P)
|
||||
if P.curY~=P.imgY and P.cur then
|
||||
if P.curY>P.imgY and P.cur then
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX("down")
|
||||
end
|
||||
P.curY=P.curY-1
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
P.spinLast=false
|
||||
end
|
||||
end
|
||||
function player.act.down4(P)
|
||||
for _=1,4 do
|
||||
if P.curY~=P.imgY and P.cur then
|
||||
if P.curY>P.imgY and P.cur then
|
||||
P.curY=P.curY-1
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
P.spinLast=false
|
||||
else
|
||||
return
|
||||
@@ -2431,9 +2549,9 @@ end
|
||||
function player.act.down10(P)
|
||||
if P.cur then
|
||||
for _=1,10 do
|
||||
if P.curY~=P.imgY then
|
||||
if P.curY>P.imgY then
|
||||
P.curY=P.curY-1
|
||||
P:freshMinY()
|
||||
P:freshBlock(true,true)
|
||||
P.spinLast=false
|
||||
else
|
||||
return
|
||||
@@ -2466,14 +2584,16 @@ function player.act.zangiRight(P)
|
||||
P.act.hardDrop(P)
|
||||
end
|
||||
--Give operations a num name
|
||||
A=player.act
|
||||
T={
|
||||
A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft,
|
||||
A.rot180 ,A.hardDrop, A.softDrop, A.hold,
|
||||
A.func ,A.restart, A.insLeft, A.insRight,
|
||||
A.insDown ,A.down1, A.down4, A.down10,
|
||||
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
|
||||
}for i=1,20 do A[i]=T[i]end;A,T=nil
|
||||
do
|
||||
local A=player.act
|
||||
local T={
|
||||
A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft,
|
||||
A.rot180 ,A.hardDrop, A.softDrop, A.hold,
|
||||
A.func ,A.restart, A.insLeft, A.insRight,
|
||||
A.insDown ,A.down1, A.down4, A.down10,
|
||||
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
|
||||
}for i=1,20 do A[i]=T[i]end
|
||||
end
|
||||
--------------------------</Control>--------------------------
|
||||
|
||||
--------------------------<Generator>--------------------------
|
||||
@@ -2567,7 +2687,7 @@ local function newEmptyPlayer(id,x,y,size)
|
||||
P.fieldBeneath=0
|
||||
|
||||
P.score1,P.b2b1=0,0
|
||||
P.dropFX,P.lockFX,P.clearFX={},{},{}
|
||||
P.dropFX,P.moveFX,P.lockFX,P.clearFX={},{},{},{}
|
||||
P.tasks={}--Tasks
|
||||
P.bonus={}--Texts
|
||||
|
||||
@@ -2579,15 +2699,20 @@ 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
|
||||
@@ -2623,6 +2748,7 @@ local function applyGameEnv(P)--Finish gameEnv processing
|
||||
|
||||
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
|
||||
end
|
||||
@@ -2696,8 +2822,11 @@ function PLY.newDemoPlayer(id,x,y,size)
|
||||
ghost=setting.ghost,center=setting.center,
|
||||
smooth=setting.smooth,grid=setting.grid,
|
||||
text=setting.text,
|
||||
lockFX=setting.lockFX,dropFX=setting.dropFX,
|
||||
clearFX=setting.clearFX,shakeFX=setting.shakeFX,
|
||||
lockFX=setting.lockFX,
|
||||
dropFX=setting.dropFX,
|
||||
moveFX=setting.moveFX,
|
||||
clearFX=setting.clearFX,
|
||||
shakeFX=setting.shakeFX,
|
||||
|
||||
_20G=false,bone=false,
|
||||
drop=1e99,lock=1e99,
|
||||
@@ -2745,9 +2874,9 @@ end
|
||||
function PLY.newRemotePlayer(id,x,y,size,actions)
|
||||
local P=newEmptyPlayer(id,x,y,size)
|
||||
|
||||
P.human=false -- 录像不是人为操作
|
||||
P.remote=true -- 远程操作
|
||||
-- 开发中
|
||||
P.human=false
|
||||
P.remote=true
|
||||
|
||||
-- P.updateAction=buildActionFunctionFromActions(P, actions)
|
||||
|
||||
loadGameEnv(P)
|
||||
@@ -2761,6 +2890,7 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
|
||||
ENV.text=false
|
||||
ENV.lockFX=nil
|
||||
ENV.dropFX=nil
|
||||
ENV.moveFX=nil
|
||||
ENV.shakeFX=nil
|
||||
end
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ function Tick.throwBadge(data)--{ifAI,Sender,timer}
|
||||
end
|
||||
function Tick.autoPause(data)
|
||||
data[1]=data[1]+1
|
||||
if SCN.cur~="play"then return end
|
||||
if SCN.cur~="play"then return true end
|
||||
if data[1]==120 then
|
||||
if SCN.cur=="play"then
|
||||
pauseGame()
|
||||
|
||||
@@ -6,62 +6,57 @@ local S=[=[
|
||||
靏鸖龘龘 込余 saki
|
||||
模电
|
||||
[rmb10+]:
|
||||
八零哥 蕴空之灵 gggf127 dtg
|
||||
ThTsOd Fireboos 金巧 10元
|
||||
立斐 Deep_Sea 时雪 yyangdid
|
||||
sfqr 心痕 Sasoric 夏小亚 仁参
|
||||
乐↗乐↘ 喜欢c4w的ztcjoin 面包 蠢熏
|
||||
潘一栗 Lied 星街书婉 祝西 829
|
||||
e m*12 我永远爱白银诺艾尔(鹏 PCX
|
||||
八零哥 蕴空之灵 gggf127 dtg ThTsOd
|
||||
Fireboos 金巧 10元 立斐 Deep_Sea
|
||||
时雪 yyangdid sfqr 心痕 Sasoric
|
||||
夏小亚 仁参 乐↗乐↘ 喜欢c4w的ztcjoin
|
||||
面包 蠢熏 潘一栗 Lied 星街书婉 祝西
|
||||
829 e m*12 我永远爱白银诺艾尔(鹏 PCX
|
||||
kagura77 呆喂 GlowingEmbers 轩辕辚
|
||||
HimuroAki TCV100 tech有养成系统了@7065
|
||||
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
|
||||
世界沃德 蓝绿 天生的魔法师 琳雨空
|
||||
T8779.易缄 吃水榴莲 诗情画意 星姐阿夸双推Man暗炎
|
||||
[*炎] [*Y] aaa222 [**城] cnDD
|
||||
红桃老给 昭庭玲秋 旋树墩 火花工作室
|
||||
Cosine
|
||||
世界沃德 蓝绿 天生的魔法师 琳雨空 T8779.易缄
|
||||
吃水榴莲 诗情画意 星姐阿夸双推Man暗炎 [*炎]
|
||||
[*Y] aaa222 [**城] cnDD 红桃老给
|
||||
昭庭玲秋 旋树墩 火花工作室 Cosine 天上_飞
|
||||
|
||||
Thanks!!!
|
||||
|
||||
Future outlook:
|
||||
New modes:
|
||||
PUYO
|
||||
game tutorial
|
||||
finesse tutorial/exam(3next, 1pt/mino, drop to score)
|
||||
game Abbr. test
|
||||
backfire
|
||||
round-based dig
|
||||
bigbang
|
||||
rhythm
|
||||
combo
|
||||
square
|
||||
field shifting(left/right)
|
||||
task survival
|
||||
dig practice
|
||||
dig zen
|
||||
symmetry
|
||||
hidden: sound only
|
||||
infinite PC challenge
|
||||
reverb (often repeat a piece many times)
|
||||
game tutorial
|
||||
finesse tutorial/exam (3next, 1pt/mino, drop to score)
|
||||
easy finesse (only revert current)
|
||||
combo
|
||||
backfire
|
||||
bigbang
|
||||
rhythm
|
||||
KPP-locked
|
||||
square
|
||||
task survival
|
||||
symmetry
|
||||
game Abbr. test
|
||||
parkour
|
||||
Other:
|
||||
mod system with:
|
||||
block/field/up/low hidden
|
||||
next[1] hidden
|
||||
next[1-n] hidden
|
||||
field flip(LR/UD)
|
||||
no fail(∞ lives)
|
||||
mini games:
|
||||
15 puzzle (with hidden mode)
|
||||
2048 (with next (with deadly mode))
|
||||
2048 (with next/deadly mode)
|
||||
mine sweeper
|
||||
tank battle
|
||||
new AI: task-Z
|
||||
cool backgrounds
|
||||
'Encrypt'(compile to byte code)
|
||||
better drop FX
|
||||
60+ fps supporting
|
||||
in-game document
|
||||
game recording
|
||||
save recordings
|
||||
full-key control
|
||||
drag control for mobile device
|
||||
new widgets (joystick etc.)
|
||||
@@ -69,6 +64,55 @@ Future outlook:
|
||||
more graphic FXs & 3D features & animations
|
||||
network game
|
||||
|
||||
0.10.6: CC更新 Cold Clear update
|
||||
新内容:
|
||||
全平台支持新版CC(也许)
|
||||
改动:
|
||||
修改UVRY的踢墙表
|
||||
修复:
|
||||
O卡住的时候旋转不刷新锁定延迟
|
||||
CC在发现重力过大后hold即报错
|
||||
|
||||
0.10.5: 特效更新 FX update
|
||||
新内容:
|
||||
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
|
||||
增加两个莫名其妙的背景(放在无尽和限时打分)
|
||||
把之前不小心弄丢的自制蓝屏报错界面捡回来了
|
||||
改动:
|
||||
雷达图OPM参数改为ADPM
|
||||
调整J/L/I的踢墙表
|
||||
根据锁延刷新模式决定锁延指示条颜色
|
||||
增加无尽挖掘连挖提示,挖完后下一波立即升起
|
||||
new English translation by @MattMayuga#8789
|
||||
修改100/400/1000L的评级要求
|
||||
软件锁界面出现时机调整,按钮位置调整
|
||||
调整混战模式倍率影响边框颜色的范围
|
||||
软件锁也可显示tip
|
||||
代码:
|
||||
重命名大多数背景
|
||||
重构create___FX函数
|
||||
修复:
|
||||
加载部分老版本存档报错
|
||||
几个设置大标题样式不统一
|
||||
有消行延迟+出块等待时连续硬降出现神秘现象
|
||||
垃圾行上涨不刷新ghost
|
||||
粘贴序列后光标位置错误
|
||||
不能用键盘复制粘贴序列
|
||||
每次启动游戏ai是一样的块序
|
||||
|
||||
0.10.4: 漏洞修复 Bug Fix
|
||||
代码:
|
||||
修改场景模块方法名
|
||||
软件锁变量名从lock改为appLock
|
||||
使用linter整理代码
|
||||
重构锁延相关代码,freshgho,freshLockDelay,freshMinY合并为freshBlock
|
||||
修复:
|
||||
BPM120~180之间分数计算不正确
|
||||
进不指定锁延的模式就报错
|
||||
锁延机制错误(这次真修好了)
|
||||
游戏结束后马上暂停并解除还会自动暂停(之前没修好)
|
||||
提前硬降失效
|
||||
|
||||
0.10.3: 软件锁 APP Lock
|
||||
新内容:
|
||||
设置增加软件锁选项,打开游戏后进入伪装界面
|
||||
|
||||
Reference in New Issue
Block a user