Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9a3e3ce1b | ||
|
|
72dcb84662 | ||
|
|
4af2126254 | ||
|
|
42d7b1be94 |
BIN
BGM/end.ogg
Normal file
BIN
BGM/end.ogg
Normal file
Binary file not shown.
BIN
BGM/newera.ogg
BIN
BGM/newera.ogg
Binary file not shown.
BIN
BGM/rockblock.ogg
Normal file
BIN
BGM/rockblock.ogg
Normal file
Binary file not shown.
BIN
SFX/collect.ogg
Normal file
BIN
SFX/collect.ogg
Normal file
Binary file not shown.
BIN
SFX/drop.ogg
BIN
SFX/drop.ogg
Binary file not shown.
BIN
SFX/lock.ogg
Normal file
BIN
SFX/lock.ogg
Normal file
Binary file not shown.
BIN
SFX/spin.ogg
BIN
SFX/spin.ogg
Binary file not shown.
25
ai.lua
25
ai.lua
@@ -51,7 +51,7 @@ function ifoverlapAI(f,bk,x,y)
|
||||
if y<1 then return true end
|
||||
if y>#f then return end
|
||||
for i=1,#bk do for j=1,#bk[1]do
|
||||
if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end
|
||||
if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
|
||||
end end
|
||||
end
|
||||
function resetField(f0,f,start)
|
||||
@@ -74,14 +74,12 @@ function getScore(field,bn,cb,cx,cy)
|
||||
local hole=0
|
||||
|
||||
for i=cy+#cb-1,cy,-1 do
|
||||
local f=true
|
||||
for j=1,10 do
|
||||
if field[i][j]==0 then f=false;break end
|
||||
end
|
||||
if f then
|
||||
removeRow(field,i)
|
||||
clear=clear+1
|
||||
if field[i][j]==0 then goto L end
|
||||
end
|
||||
removeRow(field,i)
|
||||
clear=clear+1
|
||||
::L::
|
||||
end
|
||||
if #field==0 then return 9e99 end--PC best
|
||||
for x=1,10 do
|
||||
@@ -119,7 +117,7 @@ function getScore(field,bn,cb,cx,cy)
|
||||
+clearScore[clear]*(8+#field)
|
||||
-hole*50
|
||||
if #field>6 then score=score-highest*5 end
|
||||
if mh1>3 then score=score-50-mh1*40 end
|
||||
if mh1>3 then score=score-40-mh1*30 end
|
||||
return score
|
||||
end
|
||||
function AI_getControls(ctrl)
|
||||
@@ -133,7 +131,7 @@ function AI_getControls(ctrl)
|
||||
end
|
||||
local best={x=1,dir=0,hold=false,score=-9e99}
|
||||
for ifhold=0,P.gameEnv.hold and 1 or 0 do
|
||||
local bn=ifhold==0 and P.bid or P.hid>0 and P.hid or P.nxt[1]
|
||||
local bn=ifhold==0 and P.cur.id or P.hold.id>0 and P.hold.id or P.next[1].id
|
||||
for dir=0,dirCount[bn] do--each dir
|
||||
local cb=blocks[bn][dir]
|
||||
for cx=1,11-#cb[1]do--each pos
|
||||
@@ -146,7 +144,7 @@ function AI_getControls(ctrl)
|
||||
local y=cy+i-1
|
||||
if not Tfield[y]then Tfield[y]=getNewRow()end
|
||||
for j=1,#cb[1]do
|
||||
if cb[i][j]~=0 then
|
||||
if cb[i][j]then
|
||||
Tfield[y][cx+j-1]=1
|
||||
end
|
||||
end
|
||||
@@ -173,11 +171,4 @@ function AI_getControls(ctrl)
|
||||
ins(ctrl,l[i])
|
||||
end
|
||||
ins(ctrl,6)
|
||||
|
||||
if rnd()<.1 then
|
||||
if P.atkMode~=4 and P==mostDangerous then
|
||||
ins(P.ai.controls,9)
|
||||
--Smarter AI???
|
||||
end
|
||||
end
|
||||
end
|
||||
256
call&sys.lua
256
call&sys.lua
@@ -1,3 +1,99 @@
|
||||
local gc=love.graphics
|
||||
local tm=love.timer
|
||||
local ms=love.mouse
|
||||
local tc=love.touch
|
||||
local wd=love.window
|
||||
local setFont=setFont
|
||||
local Timer=tm.getTime
|
||||
|
||||
local ww,wh=gc.getWidth(),gc.getHeight()
|
||||
local xOy=love.math.newTransform()
|
||||
local focus=true
|
||||
local mx,my,mouseShow=-20,-20,false
|
||||
local touching=nil--1st touching ID
|
||||
local sceneInit={
|
||||
load=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
loading=1--Loading mode
|
||||
loadnum=1--Loading counter
|
||||
loadprogress=0--Loading bar(0~1)
|
||||
end,
|
||||
intro=function()
|
||||
curBG="none"
|
||||
count=0
|
||||
keeprun=true
|
||||
end,
|
||||
main=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
collectgarbage()
|
||||
end,
|
||||
mode=function()
|
||||
saveData()
|
||||
modeSel=modeSel or 1
|
||||
levelSel=levelSel or 3
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
custom=function()
|
||||
optSel=optSel or 1
|
||||
curBG="matrix"
|
||||
keeprun=true
|
||||
end,
|
||||
play=function()
|
||||
keeprun=false
|
||||
resetGameData()
|
||||
sysSFX("ready")
|
||||
end,
|
||||
setting=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
setting2=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
curBoard=1
|
||||
keyboardSet=1
|
||||
joystickSet=1
|
||||
keyboardSetting=false
|
||||
joystickSetting=false
|
||||
end,--Control settings
|
||||
setting3=function()
|
||||
curBG="game1"
|
||||
keeprun=true
|
||||
defaultSel=1
|
||||
sel=nil
|
||||
snapLevel=1
|
||||
end,--Touch setting
|
||||
help=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
stat=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
quit=function()
|
||||
love.event.quit()
|
||||
end,
|
||||
}
|
||||
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
|
||||
local BGblock={tm=150,next=7,ct=0}
|
||||
local function getNewBlock()
|
||||
BGblock.ct=BGblock.ct+1
|
||||
if BGblock.ct==17 then BGblock.ct=1 end
|
||||
local t=BGblockList[BGblock.ct]
|
||||
t.bn,t.size=BGblock.next,2+3*rnd()
|
||||
t.b=blocks[t.bn][rnd(0,3)]
|
||||
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
|
||||
t.y=-#t.b*30*t.size
|
||||
t.v=t.size*(1+rnd())
|
||||
BGblock.next=BGblock.next%7+1
|
||||
return t
|
||||
end
|
||||
local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}}
|
||||
|
||||
function onVirtualkey(x,y)
|
||||
local x,y=xOy:inverseTransformPoint(x,y)
|
||||
local d2,nearest,distance
|
||||
@@ -14,37 +110,32 @@ function onVirtualkey(x,y)
|
||||
end
|
||||
function buttonControl_key(i)
|
||||
if i=="up"or i=="down"or i=="left"or i=="right"then
|
||||
if not Buttons.sel then
|
||||
if Buttons[scene][1]then
|
||||
Buttons.sel=1
|
||||
end
|
||||
if Buttons.sel then
|
||||
Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
|
||||
else
|
||||
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
|
||||
Buttons.sel=select(2,next(Buttons[scene]))
|
||||
mouseShow=false
|
||||
end
|
||||
elseif i=="space"or i=="return"then
|
||||
if not sceneSwaping and Buttons.sel then
|
||||
local B=Buttons[scene][Buttons.sel]
|
||||
B.code()
|
||||
B.alpha=1
|
||||
Buttons.sel.alpha=1
|
||||
Buttons.sel.code()
|
||||
sysSFX("button")
|
||||
end
|
||||
end
|
||||
end
|
||||
function buttonControl_gamepad(i)
|
||||
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
|
||||
if not Buttons.sel then
|
||||
if Buttons[scene][1]then
|
||||
Buttons.sel=1
|
||||
end
|
||||
mouseShow=false
|
||||
if Buttons.sel then
|
||||
Buttons.sel=Buttons[scene][Buttons.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Buttons.sel
|
||||
else
|
||||
Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel
|
||||
Buttons.sel=select(2,next(Buttons[scene]))
|
||||
mouseShow=false
|
||||
end
|
||||
elseif i=="start"then
|
||||
if not sceneSwaping and Buttons.sel then
|
||||
local B=Buttons[scene][Buttons.sel]
|
||||
B.code()
|
||||
B.alpha=1
|
||||
Buttons.sel.alpha=1
|
||||
Buttons.sel.code()
|
||||
sysSFX("button")
|
||||
end
|
||||
end
|
||||
@@ -59,6 +150,11 @@ function mouseDown.intro(x,y,k)
|
||||
gotoScene("main")
|
||||
end
|
||||
end
|
||||
wheelmoved={}
|
||||
function wheelmoved.mode(x,y)
|
||||
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
|
||||
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
|
||||
end
|
||||
keyDown={}
|
||||
function keyDown.intro(key)
|
||||
if key=="escape"then
|
||||
@@ -143,7 +239,7 @@ end
|
||||
function keyDown.play(key)
|
||||
if key=="escape"then back()return end
|
||||
local m=setting.keyMap
|
||||
for p=1,4 do
|
||||
for p=1,human do
|
||||
local lib=setting.keyLib[p]
|
||||
for s=1,#lib do
|
||||
for k=1,12 do
|
||||
@@ -158,7 +254,7 @@ end
|
||||
keyUp={}
|
||||
function keyUp.play(key)
|
||||
local m=setting.keyMap
|
||||
for p=1,4 do
|
||||
for p=1,human do
|
||||
local lib=setting.keyLib[p]
|
||||
for s=1,#lib do
|
||||
for k=1,12 do
|
||||
@@ -248,49 +344,41 @@ function gamepadUp.play(key)
|
||||
end
|
||||
end
|
||||
end
|
||||
wheelmoved={}
|
||||
function wheelmoved.mode(x,y)
|
||||
modeSel=min(max(modeSel-sgn(y),1),#modeID)
|
||||
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
|
||||
end
|
||||
|
||||
|
||||
|
||||
function love.mousemoved(x,y,dx,dy,t)
|
||||
if not t then
|
||||
mouseShow=true
|
||||
mx,my=xOy:inverseTransformPoint(x,y)
|
||||
Buttons.sel=nil
|
||||
for i=1,#Buttons[scene]do
|
||||
local B=Buttons[scene][i]
|
||||
if not(B.hide and B.hide())then
|
||||
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
|
||||
Buttons.sel=i
|
||||
return
|
||||
end
|
||||
if t then return end
|
||||
mouseShow=true
|
||||
mx,my=xOy:inverseTransformPoint(x,y)
|
||||
Buttons.sel=nil
|
||||
for N,B in next,Buttons[scene]do
|
||||
if not(B.hide and B.hide())then
|
||||
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
|
||||
Buttons.sel=B
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function love.mousepressed(x,y,k,t,num)
|
||||
if not t then
|
||||
mouseShow=true
|
||||
mx,my=xOy:inverseTransformPoint(x,y)
|
||||
if mouseDown[scene]then
|
||||
mouseDown[scene](mx,my,k)
|
||||
else
|
||||
if k==1 then
|
||||
if not sceneSwaping and Buttons.sel then
|
||||
local B=Buttons[scene][Buttons.sel]
|
||||
B.code()
|
||||
B.alpha=1
|
||||
Buttons.sel=nil
|
||||
love.mousemoved(x,y)
|
||||
sysSFX("button")
|
||||
end
|
||||
elseif k==2 then
|
||||
back()
|
||||
if t then return end
|
||||
mouseShow=true
|
||||
mx,my=xOy:inverseTransformPoint(x,y)
|
||||
if mouseDown[scene]then
|
||||
mouseDown[scene](mx,my,k)
|
||||
else
|
||||
if k==1 then
|
||||
if not sceneSwaping and Buttons.sel then
|
||||
local B=Buttons.sel
|
||||
B.code()
|
||||
B.alpha=1
|
||||
Buttons.sel=nil
|
||||
love.mousemoved(x,y)
|
||||
sysSFX("button")
|
||||
end
|
||||
elseif k==2 then
|
||||
back()
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -299,6 +387,7 @@ end
|
||||
function love.wheelmoved(x,y)
|
||||
if wheelmoved[scene]then wheelmoved[scene](x,y)end
|
||||
end
|
||||
|
||||
function love.touchpressed(id,x,y)
|
||||
if not touching then
|
||||
touching=id
|
||||
@@ -328,10 +417,11 @@ function love.touchreleased(id,x,y)
|
||||
if id==touching then
|
||||
touching=nil
|
||||
if Buttons.sel then
|
||||
local B=Buttons[scene][Buttons.sel]
|
||||
local B=Buttons.sel
|
||||
B.code()
|
||||
B.alpha=1
|
||||
Buttons.sel=nil
|
||||
sysSFX("button")
|
||||
end
|
||||
Buttons.sel=nil
|
||||
mouseShow=false
|
||||
@@ -362,11 +452,10 @@ function love.touchmoved(id,x,y,dx,dy)
|
||||
local b=virtualkey[n]
|
||||
for i=1,#l do
|
||||
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
|
||||
if(x-b[1])^2+(y-b[2])^2<=b[3]then return end
|
||||
end
|
||||
if P.keyPressing[n]then
|
||||
releaseKey(n,players[1])
|
||||
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
|
||||
end
|
||||
releaseKey(n,players[1])
|
||||
::L::
|
||||
end
|
||||
elseif scene=="setting3"then
|
||||
x,y=xOy:inverseTransformPoint(x,y)
|
||||
@@ -379,18 +468,18 @@ function love.touchmoved(id,x,y,dx,dy)
|
||||
end
|
||||
|
||||
function love.keypressed(i)
|
||||
if i=="f12"then devMode=not devMode end
|
||||
if i=="f8"then devMode=not devMode end
|
||||
if devMode then
|
||||
if i=="k"then
|
||||
P=players.alive[rnd(#players.alive)]
|
||||
Event.gameover.lose()
|
||||
Event_gameover.lose()
|
||||
--Test code here
|
||||
elseif i=="q"then
|
||||
for i=1,#Buttons[scene]do
|
||||
local B=Buttons[scene][i]
|
||||
for k,B in next,Buttons[scene]do
|
||||
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
|
||||
end
|
||||
elseif Buttons.sel then
|
||||
local B=Buttons[scene][Buttons.sel]
|
||||
local B=Buttons.sel
|
||||
if i=="left"then B.x=B.x-10
|
||||
elseif i=="right"then B.x=B.x+10
|
||||
elseif i=="up"then B.y=B.y-10
|
||||
@@ -435,6 +524,13 @@ end
|
||||
function love.joystickhat(js,hat,dir)
|
||||
|
||||
end
|
||||
|
||||
function love.sendData(data)
|
||||
return
|
||||
end
|
||||
function love.receiveData(id,data)
|
||||
return
|
||||
end
|
||||
]]
|
||||
|
||||
function love.update(dt)
|
||||
@@ -450,18 +546,18 @@ function love.update(dt)
|
||||
if BGblock[i].y>720 then rem(BGblock,i)end
|
||||
end
|
||||
if setting.bgblock then
|
||||
BGblock.ct=BGblock.ct-1
|
||||
if BGblock.ct==0 then
|
||||
BGblock.tm=BGblock.tm-1
|
||||
if BGblock.tm==0 then
|
||||
ins(BGblock,getNewBlock())
|
||||
BGblock.ct=rnd(20,30)
|
||||
BGblock.tm=rnd(20,30)
|
||||
end
|
||||
end
|
||||
if sceneSwaping then
|
||||
sceneSwaping.time=sceneSwaping.time-1
|
||||
if sceneSwaping.time==sceneSwaping.mid then
|
||||
for i=1,#Buttons[scene]do
|
||||
Buttons[scene][i].alpha=0
|
||||
end--Reset buttons' state
|
||||
for k,B in next,Buttons[scene]do
|
||||
B.alpha=0
|
||||
end--Reset buttons' alpha
|
||||
scene=sceneSwaping.tar
|
||||
BGM("blank")
|
||||
sceneInit[scene]()
|
||||
@@ -469,26 +565,23 @@ function love.update(dt)
|
||||
elseif sceneSwaping.time==0 then
|
||||
sceneSwaping=nil
|
||||
end
|
||||
elseif Tmr[scene]then
|
||||
end
|
||||
if Tmr[scene]then
|
||||
Tmr[scene](dt)
|
||||
end
|
||||
for i=#Task,1,-1 do
|
||||
Task[i]:update()
|
||||
end
|
||||
updateButton()
|
||||
end
|
||||
function love.sendData(data)
|
||||
return
|
||||
end
|
||||
function love.receiveData(id,data)
|
||||
return
|
||||
end
|
||||
function love.draw()
|
||||
gc.clear()
|
||||
Pnt.BG[curBG]()
|
||||
gc.setColor(1,1,1,.3)
|
||||
gc.setColor(1,1,1,.22)
|
||||
for n=1,#BGblock do
|
||||
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
|
||||
local size=BGblock[n].size
|
||||
for i=1,#b do for j=1,#b[1]do
|
||||
if b[i][j]>0 then
|
||||
if b[i][j]then
|
||||
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
|
||||
end
|
||||
end end
|
||||
@@ -499,7 +592,7 @@ function love.draw()
|
||||
local r=Timer()*.5
|
||||
gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3))
|
||||
r=int(r)%7+1
|
||||
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][0][2]-.5,#blocks[r][0]-scs[r][0][1]+.5)
|
||||
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5)
|
||||
gc.setColor(1,1,1,.5)
|
||||
gc.circle("fill",mx,my,5)
|
||||
gc.setColor(1,1,1)
|
||||
@@ -524,10 +617,13 @@ function love.draw()
|
||||
end
|
||||
end
|
||||
function love.resize(w,h)
|
||||
ww,wh=w,h
|
||||
if w>=h then ww,wh=w,h
|
||||
else ww,wh=h,w
|
||||
end
|
||||
screenK=h/w>=.5625 and w/1280 or h/720
|
||||
xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
|
||||
gc.replaceTransform(xOy)
|
||||
collectgarbage()
|
||||
end
|
||||
function love.run()
|
||||
local frameT=Timer()
|
||||
|
||||
44
class.lua
Normal file
44
class.lua
Normal file
@@ -0,0 +1,44 @@
|
||||
Task={}
|
||||
metatable_task={__index=Task}
|
||||
function newTask(code,P,data)
|
||||
local obj={
|
||||
code=code,
|
||||
P=P,
|
||||
data=data,
|
||||
}
|
||||
setmetatable(obj,metatable_task)
|
||||
ins(Task,obj)
|
||||
end
|
||||
function clearTask(opt)
|
||||
if opt=="all"then
|
||||
while Task[1]do
|
||||
rem(Task,i)
|
||||
end
|
||||
elseif opt=="play"then
|
||||
for i=#Task,1,-1 do
|
||||
if Task[i].P then
|
||||
rem(Task,i)
|
||||
end
|
||||
end
|
||||
else--Player table
|
||||
for i=#Task,1,-1 do
|
||||
if Task[i].P==P then
|
||||
rem(Task,i)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function Task:update()
|
||||
if self.code(self.P,self.data)then
|
||||
self:destroy()
|
||||
return nil
|
||||
end
|
||||
end
|
||||
function Task:destroy()
|
||||
for i=#Task,1,-1 do
|
||||
if Task[i]==self then
|
||||
rem(Task,i)
|
||||
return nil
|
||||
end
|
||||
end
|
||||
end
|
||||
4
conf.lua
4
conf.lua
@@ -9,7 +9,7 @@ function love.conf(t)
|
||||
t.audio.mixwithsystem=true--Switch on to keep sysBGM
|
||||
|
||||
local W=t.window
|
||||
W.title="Techmino V0.7.9"
|
||||
W.title="Techmino V0.7.13+"
|
||||
W.icon="/image/icon.png"
|
||||
W.width,W.height=1280,720
|
||||
W.minwidth,W.minheight=640,360
|
||||
@@ -17,7 +17,7 @@ function love.conf(t)
|
||||
W.resizable=true
|
||||
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
|
||||
W.fullscreen=X
|
||||
W.vsync=X--0 to set ∞fps
|
||||
W.vsync=0--0→∞fps
|
||||
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
|
||||
W.depth=X--Bits per sample in the depth buffer
|
||||
W.stencil=1--The number of bits per sample in the stencil buffer
|
||||
|
||||
1153
dataList.lua
Normal file
1153
dataList.lua
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
735
gamefunc.lua
735
gamefunc.lua
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.5 KiB |
BIN
image/mess/groupcode.png
Normal file
BIN
image/mess/groupcode.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
BIN
image/mess/light.png
Normal file
BIN
image/mess/light.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 423 B |
BIN
image/mess/lightBulb.png
Normal file
BIN
image/mess/lightBulb.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 421 B |
BIN
image/mess/paycode.png
Normal file
BIN
image/mess/paycode.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
167
language/chi.lua
167
language/chi.lua
@@ -1,18 +1,19 @@
|
||||
return{
|
||||
royale_remain=function(n)
|
||||
return "剩余 "..n.." 名玩家"
|
||||
end,
|
||||
cmb={nil,nil,"3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"},
|
||||
techrash="四清",
|
||||
techrashB2B="四清 B2B",
|
||||
techrashB3B="四清 B2B2B",
|
||||
atkModeName={"随机","徽章","击杀","反击"},
|
||||
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
|
||||
cmb={nil,nil,"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"},
|
||||
techrash="Techrash",
|
||||
techrashB2B="Techrash B2B",
|
||||
techrashB3B="Techrash B2B2B",
|
||||
block={"Z","S","L","J","T","O","I"},
|
||||
spin={"Z旋","S旋","L旋","J旋","T旋","O旋","I旋"},
|
||||
clear={"单消","双消","三清"},
|
||||
b2b="B2B",
|
||||
b3b="B2B2B",
|
||||
mini="次级",
|
||||
PC="场地全清",
|
||||
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
|
||||
clear={" single"," double"," triple"},
|
||||
b2b="B2B ",
|
||||
b3b="B2B2B ",
|
||||
mini="Mini",
|
||||
PC="Perfect Clear",
|
||||
hold="暂存",
|
||||
next="下一个",
|
||||
|
||||
stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",},
|
||||
maxspeed="最高速度",
|
||||
@@ -22,22 +23,51 @@ return{
|
||||
lose="失败",
|
||||
|
||||
custom="自定义游戏",
|
||||
customOption={
|
||||
drop="下落延迟:",
|
||||
lock="锁定延迟:",
|
||||
wait="放块延迟:",
|
||||
fall="消行延迟:",
|
||||
next="序列数量:",
|
||||
hold="暂存:",
|
||||
sequence="序列:",
|
||||
visible="可见性:",
|
||||
target="目标行数:",
|
||||
freshLimit="锁延刷新次数:",
|
||||
opponent="对手速度等级:",
|
||||
},
|
||||
customVal={
|
||||
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞","[20G]"},
|
||||
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞"},
|
||||
wait=nil,
|
||||
fall=nil,
|
||||
next=nil,
|
||||
hold={"开","关"},
|
||||
sequence={"bag7","his4","随机"},
|
||||
visible={"可见","半隐","全隐","瞬隐"},
|
||||
target={10,20,40,100,200,500,1000,"∞"},
|
||||
freshLimit={0,8,15,"∞"},
|
||||
opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11},
|
||||
},
|
||||
softdropdas="软降DAS:",
|
||||
softdroparr="软降ARR:",
|
||||
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
|
||||
keyboard="键盘",
|
||||
joystick="手柄",
|
||||
setting2Help="方向键选择/翻页,回车修改,esc返回",
|
||||
|
||||
|
||||
actName={"左移:","右移:","顺时针旋转:","顺时针旋转:","180°旋转","硬降:","软降:","暂存:","切换攻击:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
|
||||
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","切换攻击:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
|
||||
modeName={
|
||||
[0]="自定义",
|
||||
"竞速","马拉松","禅","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
|
||||
"竞速","马拉松","大师","经典","禅","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
|
||||
"全清训练","全清挑战","41人混战","99人混战","干旱","多人",
|
||||
},
|
||||
modeInfo={
|
||||
sprint="挑战世界纪录",
|
||||
marathon="尝试坚持到最后",
|
||||
master="成为方块大师",
|
||||
classic="高速经典",
|
||||
zen="无重力消除200行",
|
||||
infinite="科研沙盒",
|
||||
solo="打败AI",
|
||||
@@ -81,7 +111,7 @@ return{
|
||||
help={
|
||||
"好像也没啥好帮助的吧?就当是关于了",
|
||||
"这只是一个方块游戏,请勿过度解读和随意联想",
|
||||
"不过就当成TOP/C2/KOS/TGM3玩好了",
|
||||
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
|
||||
"游戏还在测试阶段,请 勿 外 传",
|
||||
"",
|
||||
"使用LOVE2D引擎",
|
||||
@@ -91,71 +121,76 @@ return{
|
||||
"特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!",
|
||||
"错误或者建议请附带相关信息发送到作者邮箱~",
|
||||
},
|
||||
support="支持作者",
|
||||
group="官方QQ群",
|
||||
ButtonText={
|
||||
main={
|
||||
"开始",
|
||||
"设置",
|
||||
"帮助",
|
||||
"统计信息",
|
||||
"退出",
|
||||
play="开始",
|
||||
setting="设置",
|
||||
stat="统计信息",
|
||||
help="帮助",
|
||||
quit="退出",
|
||||
},
|
||||
mode={
|
||||
"Λ",
|
||||
"v",
|
||||
"<",
|
||||
">",
|
||||
"开始",
|
||||
"自定义(C)",
|
||||
"返回",
|
||||
up="Λ",
|
||||
down="v",
|
||||
left="<",
|
||||
right=">",
|
||||
start="开始",
|
||||
custom="自定义(C)",
|
||||
back="返回",
|
||||
},
|
||||
custom={
|
||||
"Λ",
|
||||
"v",
|
||||
"<",
|
||||
">",
|
||||
"开始",
|
||||
"返回",
|
||||
up="Λ",
|
||||
down="v",
|
||||
left="<",
|
||||
right=">",
|
||||
start="开始",
|
||||
back="返回",
|
||||
},
|
||||
play={
|
||||
back="返回",
|
||||
},
|
||||
setting={
|
||||
function()return setting.ghost and"阴影 开"or"阴影 关"end,
|
||||
function()return setting.center and"旋转中心 开"or"旋转中心 关"end,
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
function()return setting.sfx and"音效 开"or"音效 关"end,
|
||||
function()return setting.bgm and"音乐 开"or"音乐 关"end,
|
||||
function()return "震动强度:"..setting.vib end,
|
||||
function()return setting.fullscreen and"全屏 开"or"全屏 关"end,
|
||||
function()return setting.bgblock and"背景动画 开"or"背景动画 关"end,
|
||||
function()return"绘制帧:"..setting.frameMul.."%"end,
|
||||
"控制设置",
|
||||
"触摸设置",
|
||||
function()return langName[setting.lang]end,
|
||||
"保存&返回",
|
||||
ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end,
|
||||
center=function()return setting.center and"旋转中心:开"or"旋转中心:关"end,
|
||||
grid=function()return setting.grid and"网格:开"or"网格:关"end,
|
||||
swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end,
|
||||
fxs=function()return setting.fxs and"特效:开"or"特效:关"end,
|
||||
dasD="-",dasU="+",
|
||||
arrD="-",arrU="+",
|
||||
sddasD="-",sddasU="+",
|
||||
sdarrD="-",sdarrU="+",
|
||||
sfx=function()return setting.sfx and"音效:开"or"音效:关"end,
|
||||
bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end,
|
||||
vib=function()return "震动强度:"..setting.vib end,
|
||||
fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end,
|
||||
bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end,
|
||||
frame=function()return"绘制帧:"..setting.frameMul.."%"end,
|
||||
control="控制设置",
|
||||
touch="触摸设置",
|
||||
lang=function()return langName[setting.lang]end,
|
||||
back="保存&返回",
|
||||
},
|
||||
setting2={
|
||||
"返回",
|
||||
back="返回",
|
||||
},
|
||||
setting3={
|
||||
"返回",
|
||||
function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
|
||||
"默认组合",
|
||||
function()return snapLevelName[snapLevel]end,
|
||||
function()return percent0to5[setting.virtualkeyAlpha]end,
|
||||
"图标",
|
||||
"大小",
|
||||
back="返回",
|
||||
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
|
||||
default="默认组合",
|
||||
snap=function()return text.snapLevelName[snapLevel]end,
|
||||
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
|
||||
icon="图标",
|
||||
size="大小",
|
||||
},
|
||||
help={
|
||||
"返回",
|
||||
"作者QQ",
|
||||
back="返回",
|
||||
qq="作者QQ",
|
||||
},
|
||||
stat={
|
||||
"返回",
|
||||
back="返回",
|
||||
path="打开存储目录",
|
||||
},
|
||||
},
|
||||
}--中文→
|
||||
}--中文
|
||||
151
language/eng.lua
151
language/eng.lua
@@ -1,18 +1,19 @@
|
||||
return{
|
||||
royale_remain=function(n)
|
||||
return n.." Players Remain"
|
||||
end,
|
||||
atkModeName={"Random","Badges","K.O.s","Counters"},
|
||||
royale_remain=function(n)return n.." Players Remain"end,
|
||||
cmb={nil,nil,"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"},
|
||||
techrash="Techrash",
|
||||
techrashB2B="Techrash B2B",
|
||||
techrashB3B="Techrash B2B2B",
|
||||
block={"Z","S","L","J","T","O","I"},
|
||||
spin={"Z spin","S spin","L spin","J spin","T spin","O spin","I spin"},
|
||||
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
|
||||
clear={" single"," double"," triple"},
|
||||
b2b=" B2B",
|
||||
b3b=" B2B2B",
|
||||
b2b="B2B ",
|
||||
b3b="B2B2B ",
|
||||
mini="Mini",
|
||||
PC="Perfect Clear",
|
||||
hold="Hold",
|
||||
next="Next",
|
||||
|
||||
stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",},
|
||||
maxspeed="Max speed",
|
||||
@@ -22,8 +23,35 @@ return{
|
||||
lose="LOSE",
|
||||
|
||||
custom="Custom Game",
|
||||
customOption={
|
||||
drop="Drop delay:",
|
||||
lock="Lock delay:",
|
||||
wait="Next piece delay:",
|
||||
fall="Clear row delay:",
|
||||
next="Next count:",
|
||||
hold="Hold:",
|
||||
sequence="Sequence:",
|
||||
visible="Visible:",
|
||||
target="Line limit:",
|
||||
freshLimit="Lock fresh limit:",
|
||||
opponent="Opponent speed:",
|
||||
},
|
||||
customVal={
|
||||
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞","[20G]"},
|
||||
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞"},
|
||||
wait=nil,
|
||||
fall=nil,
|
||||
next=nil,
|
||||
hold={"ON","OFF"},
|
||||
sequence={"bag7","his4","random"},
|
||||
visible={"normal","time","invisible","sudden"},
|
||||
target={10,20,40,100,200,500,1000,"∞"},
|
||||
freshLimit={0,8,15,"∞"},
|
||||
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
|
||||
},
|
||||
softdropdas="softdropDAS:",
|
||||
softdroparr="softdropARR:",
|
||||
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
|
||||
keyboard="Keyboard",
|
||||
joystick="Joystick",
|
||||
setting2Help="Arrowkey to select/change slot,Enter to change,Esc back",
|
||||
@@ -32,12 +60,14 @@ return{
|
||||
actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Swap:","Restart:","Instant Left:","Instant Right:","Ins Down:"},
|
||||
modeName={
|
||||
[0]="Custom",
|
||||
"Sprint","Marathon","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
|
||||
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
|
||||
"PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat",
|
||||
},
|
||||
modeInfo={
|
||||
sprint="Speed run",
|
||||
marathon="Survive and reach target",
|
||||
master="To be Grand Master",
|
||||
classic="Vintage car drag racing",
|
||||
zen="Clear 200 Lines without gravity",
|
||||
infinite="Infinite game,infinite happiness",
|
||||
solo="Beat AI",
|
||||
@@ -91,71 +121,80 @@ return{
|
||||
"Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!",
|
||||
"Any bugs/suggestions to my E-mail.",
|
||||
},
|
||||
support="Support Author",
|
||||
group="Official QQ Group",
|
||||
ButtonText={
|
||||
main={
|
||||
"Play",
|
||||
"Settings",
|
||||
"Help",
|
||||
"Statistics",
|
||||
"Quit",
|
||||
play="Play",
|
||||
setting="Settings",
|
||||
stat="Statistics",
|
||||
help="Help",
|
||||
quit="Quit",
|
||||
},
|
||||
mode={
|
||||
"Λ",
|
||||
"v",
|
||||
"<",
|
||||
">",
|
||||
"Start",
|
||||
"Custom(C)",
|
||||
"Back",
|
||||
up="Λ",
|
||||
down="v",
|
||||
left="<",
|
||||
right=">",
|
||||
start="Start",
|
||||
custom="Custom(C)",
|
||||
back="Back",
|
||||
},
|
||||
custom={
|
||||
"Λ",
|
||||
"v",
|
||||
"<",
|
||||
">",
|
||||
"Start",
|
||||
"Back",
|
||||
up="Λ",
|
||||
down="v",
|
||||
left="<",
|
||||
right=">",
|
||||
start="Start",
|
||||
back="Back",
|
||||
},
|
||||
play={
|
||||
back="Back",
|
||||
},
|
||||
setting={
|
||||
function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end,
|
||||
function()return setting.center and"Center:ON"or"Center:OFF"end,
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
"-",
|
||||
"+",
|
||||
function()return setting.sfx and"SFX:on"or"SFX:off"end,
|
||||
function()return setting.bgm and"BGM:on"or"BGM:off"end,
|
||||
function()return "Vibrate level:"..setting.vib end,
|
||||
function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end,
|
||||
function()return setting.bgblock and"BG animation:on"or"BG animation:off"end,
|
||||
function()return"FrameDraw:"..setting.frameMul.."%"end,
|
||||
"Control settings",
|
||||
"Touch settings",
|
||||
function()return langName[setting.lang]end,
|
||||
"Save&Back",
|
||||
ghost=function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end,
|
||||
center=function()return setting.center and"Center:ON"or"Center:OFF"end,
|
||||
grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end,
|
||||
swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end,
|
||||
fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end,
|
||||
dasD="-",
|
||||
dasU="+",
|
||||
arrD="-",
|
||||
arrU="+",
|
||||
sddasD="-",
|
||||
sddasU="+",
|
||||
sdarrD="-",
|
||||
sdarrU="+",
|
||||
sfx=function()return setting.sfx and"SFX:ON"or"SFX:OFF"end,
|
||||
bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end,
|
||||
vib=function()return "Vibrate level:"..setting.vib end,
|
||||
fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:OFF"end,
|
||||
bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end,
|
||||
frame=function()return"FrameDraw:"..setting.frameMul.."%"end,
|
||||
control="Control settings",
|
||||
touch="Touch settings",
|
||||
lang=function()return langName[setting.lang]end,
|
||||
back="Save&Back",
|
||||
},
|
||||
setting2={
|
||||
"Back",
|
||||
back="Back",
|
||||
},
|
||||
setting3={
|
||||
"Back",
|
||||
function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,
|
||||
"Defaults",
|
||||
function()return snapLevelName[snapLevel]end,
|
||||
function()return percent0to5[setting.virtualkeyAlpha]end,
|
||||
"Icon",
|
||||
"Size",
|
||||
back="Back",
|
||||
hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,
|
||||
default="Defaults",
|
||||
snap=function()return text.snapLevelName[snapLevel]end,
|
||||
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
|
||||
icon="Icon",
|
||||
size="Size",
|
||||
},
|
||||
help={
|
||||
"Back",
|
||||
"Author's qq",
|
||||
back="Back",
|
||||
qq="Author's qq",
|
||||
},
|
||||
stat={
|
||||
"Back",
|
||||
back="Back",
|
||||
path="Open Data Folder",
|
||||
},
|
||||
}
|
||||
}
|
||||
666
main.lua
666
main.lua
@@ -1,67 +1,55 @@
|
||||
lib={
|
||||
gc=love.graphics,
|
||||
kb=love.keyboard,
|
||||
ms=love.mouse,
|
||||
tc=love.touch,
|
||||
tm=love.timer,
|
||||
fs=love.filesystem,
|
||||
wd=love.window,
|
||||
mt=love.math,
|
||||
sys=love.system,
|
||||
}for k,v in pairs(lib)do _G[k]=v end lib=nil
|
||||
toN,toS=tonumber,tostring
|
||||
local gc=love.graphics
|
||||
local tm=love.timer
|
||||
local ms,kb=love.mouse,love.keyboard
|
||||
local fs,sys=love.filesystem,love.system
|
||||
int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
|
||||
sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
|
||||
ins,rem,sort=table.insert,table.remove,table.sort
|
||||
null=function()end
|
||||
|
||||
ww,wh=gc.getWidth(),gc.getHeight()
|
||||
Timer=tm.getTime--Easy&Quick to get time!
|
||||
mx,my,mouseShow=-20,-20,false
|
||||
xOy=love.math.newTransform()
|
||||
focus=true
|
||||
|
||||
system=sys.getOS()
|
||||
touching=nil--1st touching ID
|
||||
|
||||
scene=""
|
||||
bgmPlaying=nil
|
||||
curBG="none"
|
||||
BGblock={ct=150,next=7}
|
||||
|
||||
kb.setKeyRepeat(false)
|
||||
kb.setTextInput(false)
|
||||
ms.setVisible(false)
|
||||
|
||||
Fonts={}
|
||||
local Fonts={}
|
||||
function setFont(s)
|
||||
if s~=currentFont then
|
||||
if Fonts[s]then
|
||||
gc.setFont(Fonts[s])
|
||||
else
|
||||
local t=gc.setNewFont("allph.ttf",s-5)
|
||||
local t=gc.setNewFont("font.ttf",s-5)
|
||||
Fonts[s]=t
|
||||
gc.setFont(t)
|
||||
end
|
||||
currentFont=s
|
||||
end
|
||||
return Fonts[s]
|
||||
end
|
||||
|
||||
gameEnv0={
|
||||
das=10,arr=2,
|
||||
sddas=0,sdarr=2,
|
||||
ghost=true,center=true,
|
||||
grid=false,swap=true,
|
||||
_20G=false,bone=false,
|
||||
drop=30,lock=45,
|
||||
wait=1,fall=1,
|
||||
wait=0,fall=0,
|
||||
next=6,hold=true,oncehold=true,
|
||||
sequence="bag7",visible=1,
|
||||
_20G=false,target=1e99,
|
||||
freshLimit=15,
|
||||
|
||||
keepVisible=true,visible="show",
|
||||
sequence="bag7",
|
||||
block=true,
|
||||
ospin=true,
|
||||
freshLimit=1e99,
|
||||
target=1e99,
|
||||
reach=null,
|
||||
bg="none",
|
||||
bgm="race"
|
||||
--not all is actually used,some only provide a key
|
||||
}
|
||||
customSel={
|
||||
drop=20,
|
||||
@@ -76,599 +64,19 @@ customSel={
|
||||
freshLimit=3,
|
||||
opponent=1,
|
||||
}
|
||||
loadmode={
|
||||
sprint=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
marathon=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
zen=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
infinite=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
solo=function()
|
||||
createPlayer(1,200,15)
|
||||
createPlayer(2,830,220,.7,customRange.opponent[3*curMode.lv])
|
||||
end,
|
||||
tsd=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
blind=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
dig=function()
|
||||
createPlayer(1,340,15)
|
||||
local P=players[1]
|
||||
if curMode.lv==1 then
|
||||
ins(players[1].task,Event.task.dig_normal)
|
||||
pushSpeed=1
|
||||
elseif curMode.lv==2 then
|
||||
ins(players[1].task,Event.task.dig_lunatic)
|
||||
pushSpeed=1
|
||||
end
|
||||
end,
|
||||
survivor=function()
|
||||
createPlayer(1,340,15)
|
||||
local P=players[1]
|
||||
ins(players[1].task,Event.task[curMode.lv==1 and"survivor_easy"or curMode.lv==2 and"survivor_normal"or curMode.lv==3 and"survivor_hard"or curMode.lv==4 and"survivor_lunatic"])
|
||||
pushSpeed=curMode.lv>2 and 2 or 1
|
||||
end,
|
||||
tech=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
pctrain=function()
|
||||
createPlayer(1,340,15)
|
||||
P=players[1]
|
||||
Event.newPC()
|
||||
P.freshNext()
|
||||
end,
|
||||
pcchallenge=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
techmino41=function()
|
||||
createPlayer(1,340,15)--Player
|
||||
if curMode.lv==5 then players[1].gameEnv.drop=15 end
|
||||
local n,min,max=2
|
||||
if curMode.lv==1 then min,max=5,30
|
||||
elseif curMode.lv==2 then min,max=3,25
|
||||
elseif curMode.lv==3 then min,max=2,20
|
||||
elseif curMode.lv==4 then min,max=2,10
|
||||
elseif curMode.lv==5 then min,max=1,6
|
||||
end
|
||||
for i=1,4 do for j=1,5 do
|
||||
createPlayer(n,77*i-55,140*j-125,.2,rnd(min,max))
|
||||
n=n+1
|
||||
end end
|
||||
for i=9,12 do for j=1,5 do
|
||||
createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max))
|
||||
n=n+1
|
||||
end end
|
||||
--AIs
|
||||
|
||||
end,
|
||||
techmino99=function()
|
||||
createPlayer(1,340,15)--Player
|
||||
if curMode.lv==5 then players[1].gameEnv.drop=15 end
|
||||
local n,min,max=2
|
||||
if curMode.lv==1 then min,max=5,32
|
||||
elseif curMode.lv==2 then min,max=3,25
|
||||
elseif curMode.lv==3 then min,max=2,18
|
||||
elseif curMode.lv==4 then min,max=2,12
|
||||
elseif curMode.lv==5 then min,max=1,12
|
||||
end
|
||||
for i=1,7 do for j=1,7 do
|
||||
createPlayer(n,46*i-36,97*j-72,.135,rnd(min,max))
|
||||
n=n+1
|
||||
end end
|
||||
for i=15,21 do for j=1,7 do
|
||||
createPlayer(n,46*i+264,97*j-72,.135,rnd(min,max))
|
||||
n=n+1
|
||||
end end
|
||||
--AIs
|
||||
|
||||
end,
|
||||
drought=function()
|
||||
createPlayer(1,340,15)
|
||||
end,
|
||||
hotseat=function()
|
||||
if curMode.lv==1 then
|
||||
createPlayer(1,20,15)
|
||||
createPlayer(2,650,15)
|
||||
elseif curMode.lv==2 then
|
||||
createPlayer(1,20,100,.65)
|
||||
createPlayer(2,435,100,.65)
|
||||
createPlayer(3,850,100,.65)
|
||||
elseif curMode.lv==3 then
|
||||
createPlayer(1,25,160,.5)
|
||||
createPlayer(2,335,160,.5)
|
||||
createPlayer(3,645,160,.5)
|
||||
createPlayer(4,955,160,.5)
|
||||
end
|
||||
end,
|
||||
custom=function()
|
||||
for i=1,#customID do
|
||||
local k=customID[i]
|
||||
modeEnv[k]=customRange[k][customSel[k]]
|
||||
end
|
||||
modeEnv._20G=modeEnv.drop==-1
|
||||
if modeEnv.opponent==0 then
|
||||
createPlayer(1,340,15)
|
||||
else
|
||||
modeEnv.target=nil
|
||||
createPlayer(1,20,15)
|
||||
createPlayer(2,660,85,.9,modeEnv.opponent)
|
||||
end
|
||||
end,
|
||||
}
|
||||
mesDisp={
|
||||
--Default:font=35,white
|
||||
sprint=function()
|
||||
setFont(70)
|
||||
mStr(max(P.gameEnv.target-P.cstat.row,0),-75,260)
|
||||
end,
|
||||
zen=function()
|
||||
setFont(75)
|
||||
mStr(max(200-P.cstat.row,0),-75,280)
|
||||
end,
|
||||
infinite=function()
|
||||
setFont(50)
|
||||
mStr(P.cstat.atk,-75,310)
|
||||
mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-75,420)
|
||||
setFont(20)
|
||||
mStr("Attack",-75,363)
|
||||
mStr("Efficiency",-75,475)
|
||||
end,
|
||||
marathon=function()
|
||||
setFont(50)
|
||||
mStr(P.cstat.row,-75,320)
|
||||
mStr(P.gameEnv.target,-75,370)
|
||||
gc.rectangle("fill",-120,376,90,4)
|
||||
end,
|
||||
tsd=function()
|
||||
setFont(35)
|
||||
mStr("TSD",-75,405)
|
||||
setFont(80)
|
||||
mStr(P.cstat.event,-75,330)
|
||||
end,
|
||||
blind=function()
|
||||
setFont(25)
|
||||
mStr("Rows",-75,300)
|
||||
mStr("Techrash",-75,420)
|
||||
setFont(80)
|
||||
mStr(P.cstat.row,-75,220)
|
||||
mStr(P.cstat.techrash,-75,340)
|
||||
end,
|
||||
dig=function()
|
||||
setFont(70)
|
||||
mStr(P.cstat.event,-75,310)
|
||||
setFont(30)
|
||||
mStr("Wave",-75,375)
|
||||
end,
|
||||
survivor=function()
|
||||
setFont(70)
|
||||
mStr(P.cstat.event,-75,310)
|
||||
setFont(30)
|
||||
mStr("Wave",-75,375)
|
||||
end,
|
||||
pctrain=function()
|
||||
setFont(25)
|
||||
mStr("Perfect Clear",-75,410)
|
||||
setFont(80)
|
||||
mStr(P.cstat.pc,-75,330)
|
||||
end,
|
||||
pcchallenge=function()
|
||||
setFont(25)
|
||||
mStr("Perfect Clear",-75,430)
|
||||
setFont(80)
|
||||
mStr(P.cstat.pc,-75,350)
|
||||
setFont(50)
|
||||
mStr(max(100-P.cstat.row,0),-75,250)
|
||||
end,
|
||||
techmino41=function()
|
||||
setFont(40)
|
||||
mStr(#players.alive.."/41",-75,175)
|
||||
mStr(P.ko,-60,215)
|
||||
setFont(25)
|
||||
gc.print("KO",-115,225)
|
||||
gc.setColor(1,.5,0,.6)
|
||||
gc.print(P.badge,-35,227)
|
||||
gc.setColor(1,1,1)
|
||||
setFont(30)
|
||||
gc.print(up0to4[P.strength],-125,290)
|
||||
for i=1,P.strength do
|
||||
gc.draw(badgeIcon,16*i-130,260)
|
||||
end
|
||||
end,
|
||||
techmino99=function()
|
||||
setFont(40)
|
||||
mStr(#players.alive.."/99",-75,175)
|
||||
mStr(P.ko,-60,215)
|
||||
setFont(25)
|
||||
gc.print("KO",-115,225)
|
||||
gc.setColor(1,.5,0,.6)
|
||||
gc.print(P.badge,-35,227)
|
||||
gc.setColor(1,1,1)
|
||||
setFont(30)
|
||||
gc.print(up0to4[P.strength],-125,290)
|
||||
for i=1,P.strength do
|
||||
gc.draw(badgeIcon,16*i-130,260)
|
||||
end
|
||||
end,
|
||||
drought=function()
|
||||
setFont(75)
|
||||
mStr(max(100-P.cstat.row,0),-75,280)
|
||||
end,
|
||||
custom=function()
|
||||
if P.gameEnv.target<1e4 then
|
||||
setFont(75)
|
||||
mStr(max(P.gameEnv.target-P.cstat.row,0),-75,280)
|
||||
end
|
||||
end
|
||||
}
|
||||
Event={
|
||||
gameover={
|
||||
win=function()
|
||||
local P=players.alive[1]
|
||||
P.alive=false
|
||||
P.control=false
|
||||
P.timing=false
|
||||
P.waiting=1e99
|
||||
P.b2b=0
|
||||
if modeEnv.royaleMode then
|
||||
P.rank=1
|
||||
P.result="WIN"
|
||||
showText(P,1,"appear",60,120,nil,true)
|
||||
changeAtk(P)
|
||||
end
|
||||
::L::if P.task[1]then
|
||||
rem(P.task)
|
||||
goto L
|
||||
end
|
||||
for i=1,#P.atkBuffer do
|
||||
P.atkBuffer[i].sent=true
|
||||
P.atkBuffer[i].time=0
|
||||
end
|
||||
for i=1,#P.field do
|
||||
for j=1,10 do
|
||||
P.visTime[i][j]=min(P.visTime[i][j],20)
|
||||
end
|
||||
end
|
||||
showText(P,text.win,"beat",90,nil,nil,true)
|
||||
if P.id==1 and players[2]and players[2].ai then SFX("win")end
|
||||
ins(P.task,Event.task.win)
|
||||
end,
|
||||
lose=function()
|
||||
P.alive=false
|
||||
P.control=false
|
||||
P.timing=false
|
||||
P.waiting=1e99
|
||||
P.b2b=0
|
||||
::L::if P.task[1]then
|
||||
rem(P.task)
|
||||
goto L
|
||||
end
|
||||
for i=1,#players.alive do
|
||||
if players.alive[i]==P then
|
||||
rem(players.alive,i)
|
||||
break
|
||||
end
|
||||
end
|
||||
if modeEnv.royaleMode then
|
||||
changeAtk(P)
|
||||
P.result="K.O."
|
||||
P.rank=#players.alive+1
|
||||
showText(P,P.rank,"appear",60,120,nil,true)
|
||||
P.strength=0
|
||||
local A=P
|
||||
::L::
|
||||
A=A.lastRecv
|
||||
if A and not A.alive and A~=P then goto L end
|
||||
if A and A~=P then
|
||||
if P.id==1 or A.id==1 then
|
||||
throwBadge(P,A,P.badge)
|
||||
P.killMark=A.id==1
|
||||
end
|
||||
A.ko,A.badge=A.ko+1,A.badge+P.badge+1
|
||||
for i=A.strength+1,4 do
|
||||
if A.badge>=modeEnv.royalePowerup[i]then
|
||||
A.strength=i
|
||||
end
|
||||
end
|
||||
if P==mostBadge then
|
||||
mostBadge,secBadge=secBadge
|
||||
elseif P==secBadge then
|
||||
secBadge=nil
|
||||
end
|
||||
if mostBadge then
|
||||
if A.badge>mostBadge.badge then
|
||||
if A~=mostBadge then
|
||||
mostBadge,secBadge=A,mostBadge
|
||||
end
|
||||
elseif secBadge then
|
||||
if A.badge>secBadge.badge then
|
||||
secBadge=A
|
||||
end
|
||||
else
|
||||
secBadge=A
|
||||
end
|
||||
else
|
||||
mostBadge=A
|
||||
end
|
||||
end
|
||||
freshMostDangerous()
|
||||
for i=1,#players.alive do
|
||||
if players.alive[i].atking==P then
|
||||
freshTarget(players.alive[i])
|
||||
end
|
||||
end
|
||||
if #players.alive==modeEnv.royaleRemain[gameStage]then
|
||||
royaleLevelup()
|
||||
end
|
||||
end
|
||||
for i=1,#P.atkBuffer do
|
||||
P.atkBuffer[i].sent=true
|
||||
P.atkBuffer[i].time=0
|
||||
end
|
||||
for i=1,#P.field do
|
||||
for j=1,10 do
|
||||
P.visTime[i][j]=min(P.visTime[i][j],20)
|
||||
end
|
||||
end
|
||||
showText(P,text.lose,"appear",90,nil,nil,true)
|
||||
if P.id==1 and players[2]and players[2].ai then SFX("fail")end
|
||||
ins(P.task,Event.task.lose)
|
||||
if #players.alive==1 then
|
||||
local t=P
|
||||
P=players.alive[1]
|
||||
Event.gameover.win()
|
||||
P=t
|
||||
end
|
||||
end,
|
||||
},
|
||||
marathon_reach=function()
|
||||
local s=int(P.cstat.row*.1)
|
||||
if s>=20 then
|
||||
P.cstat.row=200
|
||||
Event.gameover.win()
|
||||
else
|
||||
P.gameEnv.drop=marathon_drop[s]
|
||||
if s==18 then P.gameEnv._20G=true end
|
||||
P.gameEnv.target=s*10+10
|
||||
SFX("reach")
|
||||
end
|
||||
end,
|
||||
marathon_reach_lunatic=function()
|
||||
if P.gameEnv.target==250 then
|
||||
P.cstat.row=250
|
||||
Event.gameover.win()
|
||||
else
|
||||
P.gameEnv.target=P.gameEnv.target+50
|
||||
local t=P.gameEnv.target/50
|
||||
P.gameEnv.lock=rush_lock[t]
|
||||
P.gameEnv.wait=rush_wait[t]
|
||||
P.gameEnv.fall=rush_fall[t]
|
||||
showText(P,text.stage[t],"fly",80,-120)
|
||||
SFX("reach")
|
||||
end
|
||||
end,
|
||||
marathon_reach_ultimate=function()
|
||||
if P.cstat.event==5 then
|
||||
P.cstat.row=250
|
||||
Event.gameover.win()
|
||||
else
|
||||
local t=P.cstat.event+1
|
||||
if t==1 then t=2 end
|
||||
P.gameEnv.target=50*t
|
||||
P.cstat.event=t
|
||||
P.gameEnv.lock=death_lock[t]
|
||||
P.gameEnv.wait=death_wait[t]
|
||||
P.gameEnv.fall=death_fall[t]
|
||||
showText(P,text.stage[t],"fly",80,-120)
|
||||
SFX("reach")
|
||||
end
|
||||
end,
|
||||
tsd_reach=function()
|
||||
if P.lastClear~=52 then
|
||||
Event.gameover.lose()
|
||||
else
|
||||
P.gameEnv.target=P.gameEnv.target+2
|
||||
P.cstat.event=P.cstat.event+1
|
||||
if #P.field>11 and P.cstat.event%5~=1 then
|
||||
ins(P.clearing,1)
|
||||
end
|
||||
end
|
||||
end,
|
||||
tech_reach=function()
|
||||
if #P.clearing>0 and P.lastClear<10 then
|
||||
Event.gameover.lose()
|
||||
end
|
||||
end,
|
||||
tech_reach_hard=function()
|
||||
if #P.clearing>0 and P.lastClear<10 or P.lastClear==74 then
|
||||
Event.gameover.lose()
|
||||
end
|
||||
end,
|
||||
newPC=function()
|
||||
local P=players[1]
|
||||
if P.cstat.piece%4==0 then
|
||||
if #P.field==#P.clearing then
|
||||
P.counter=P.cstat.piece==0 and 20 or 0
|
||||
ins(P.task,Event.task.PC)
|
||||
if curMode.lv==2 then
|
||||
local s=P.cstat.pc*.5
|
||||
if int(s)==s and s>0 then
|
||||
P.gameEnv.drop=pc_drop[s]or 10
|
||||
P.gameEnv.lock=pc_lock[s]or 20
|
||||
P.gameEnv.fall=pc_fall[s]or 5
|
||||
if s==10 then
|
||||
showText(P,text.maxspeed,"appear",80,-140)
|
||||
else
|
||||
showText(P,text.speedup,"appear",30,-140)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
Event.gameover.lose()
|
||||
end
|
||||
end
|
||||
end,
|
||||
task={
|
||||
win=function()
|
||||
P.endCounter=P.endCounter+1
|
||||
if P.endCounter>80 then
|
||||
if P.gameEnv.visible==1 then
|
||||
for i=1,#P.field do
|
||||
for j=1,10 do
|
||||
if P.visTime[i][j]>0 then
|
||||
P.visTime[i][j]=P.visTime[i][j]-1
|
||||
end
|
||||
end
|
||||
end
|
||||
if P.endCounter==100 then
|
||||
for i=1,#P.field do
|
||||
removeRow(P.field)
|
||||
removeRow(P.visTime)
|
||||
end
|
||||
return true
|
||||
end
|
||||
elseif P.endCounter==100 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end,
|
||||
lose=function()
|
||||
P.endCounter=P.endCounter+1
|
||||
if P.endCounter>80 then
|
||||
if P.gameEnv.visible==1 then
|
||||
for i=1,#P.field do
|
||||
for j=1,10 do
|
||||
if P.visTime[i][j]>0 then
|
||||
P.visTime[i][j]=P.visTime[i][j]-1
|
||||
end
|
||||
end
|
||||
end
|
||||
if P.endCounter==100 then
|
||||
for i=1,#P.field do
|
||||
removeRow(P.field)
|
||||
removeRow(P.visTime)
|
||||
end
|
||||
return true
|
||||
end
|
||||
elseif P.endCounter==100 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end,
|
||||
dig_normal=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if #P.clearing==0 and P.counter>=max(90,180-2*P.cstat.event)then
|
||||
ins(P.field,1,getNewRow(13))
|
||||
ins(P.visTime,1,getNewRow(1e99))
|
||||
P.field[1][rnd(10)]=0
|
||||
P.fieldBeneath=P.fieldBeneath+30
|
||||
P.cy,P.y_img=P.cy+1,P.y_img+1
|
||||
P.counter=0
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
dig_lunatic=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if #P.clearing==0 and P.counter>=max(40,60-.5*P.cstat.event)then
|
||||
ins(P.field,1,getNewRow(13))
|
||||
ins(P.visTime,1,getNewRow(1e99))
|
||||
P.field[1][rnd(10)]=0
|
||||
P.fieldBeneath=P.fieldBeneath+30
|
||||
P.cy,P.y_img=P.cy+1,P.y_img+1
|
||||
P.counter=0
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
survivor_easy=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if P.counter==max(60,180-2*P.cstat.event)then
|
||||
ins(P.atkBuffer,{rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1})
|
||||
P.counter=0
|
||||
if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
survivor_normal=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if P.counter==max(60,180-2*P.cstat.event)then
|
||||
local d=P.cstat.event+1
|
||||
if d%4==0 then ins (P.atkBuffer,{rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1})
|
||||
elseif d%4==1 then ins(P.atkBuffer,{rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1})
|
||||
elseif d%4==2 then ins(P.atkBuffer,{rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2})
|
||||
elseif d%4==3 then ins(P.atkBuffer,{rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3})
|
||||
end
|
||||
P.counter=0
|
||||
if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
survivor_hard=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if P.counter==max(60,180-2*P.cstat.event)then
|
||||
if P.cstat.event%3<2 then
|
||||
ins(P.atkBuffer,{rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1})
|
||||
else
|
||||
ins(P.atkBuffer,{rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2})
|
||||
end
|
||||
P.counter=0
|
||||
if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
survivor_lunatic=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if P.counter==max(90,150-P.cstat.event)then
|
||||
local t=max(60,90-P.cstat.event)
|
||||
ins(P.atkBuffer,{rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3})
|
||||
P.counter=0
|
||||
if P.cstat.event==30 then showText(P,text.maxspeed,"appear",80,-140)end
|
||||
P.cstat.event=P.cstat.event+1
|
||||
end
|
||||
end,
|
||||
PC=function()
|
||||
local P=players[1]
|
||||
P.counter=P.counter+1
|
||||
if P.counter==21 then
|
||||
local t=P.cstat.pc%2
|
||||
for i=1,4 do
|
||||
local r=getNewRow()
|
||||
for j=1,10 do
|
||||
r[j]=PCbase[4*t+i][j]
|
||||
end
|
||||
ins(P.field,1,r)
|
||||
ins(P.visTime,1,getNewRow(P.showTime))
|
||||
end
|
||||
P.fieldBeneath=P.fieldBeneath+120
|
||||
-- P.cy=P.cy+4
|
||||
P.y_img=P.y_img+4
|
||||
freshgho()
|
||||
return true
|
||||
end
|
||||
end,
|
||||
},
|
||||
}
|
||||
--Game system Data
|
||||
setting={
|
||||
lang=1,
|
||||
ghost=true,center=true,
|
||||
grid=false,swap=true,
|
||||
fxs=true,
|
||||
|
||||
das=10,arr=2,
|
||||
sddas=0,sdarr=2,
|
||||
|
||||
sfx=true,bgm=true,vib=3,
|
||||
fullscreen=false,
|
||||
bgblock=true,
|
||||
das=10,arr=2,
|
||||
sddas=0,sdarr=2,
|
||||
ghost=true,center=true,
|
||||
lang=1,
|
||||
keyMap={
|
||||
{"left","right","x","z","c","up","down","space","tab","r","","",""},
|
||||
{"","","","","","","","","","","","",""},
|
||||
@@ -742,9 +150,18 @@ virtualkey={
|
||||
virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false}
|
||||
virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0}
|
||||
--User Data&User Setting
|
||||
require("toolfunc")
|
||||
userData=fs.newFile("userdata")
|
||||
userSetting=fs.newFile("usersetting")
|
||||
require"toolfunc"
|
||||
require"list"
|
||||
require"class"
|
||||
require"gamefunc"
|
||||
require"ai"
|
||||
require"timer"
|
||||
require"paint"
|
||||
require"call&sys"
|
||||
require"dataList"
|
||||
require"texture"
|
||||
|
||||
userData,userSetting=fs.newFile("userdata"),fs.newFile("usersetting")
|
||||
if fs.getInfo("userdata")then
|
||||
loadData()
|
||||
end
|
||||
@@ -752,13 +169,6 @@ if fs.getInfo("usersetting")then
|
||||
loadSetting()
|
||||
elseif system=="Android" or system=="iOS"then
|
||||
setting.virtualkeySwitch=true
|
||||
setting.swap=false
|
||||
end
|
||||
|
||||
require("gamefunc")
|
||||
require("ai")
|
||||
require("timer")
|
||||
require("paint")
|
||||
require("call&sys")
|
||||
require("list")
|
||||
swapLanguage(setting.lang)
|
||||
require("texture")
|
||||
swapLanguage(setting.lang)
|
||||
461
paint.lua
461
paint.lua
@@ -1,40 +1,65 @@
|
||||
swapDeck_data={
|
||||
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
|
||||
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
|
||||
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
|
||||
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
|
||||
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
|
||||
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
|
||||
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
|
||||
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
|
||||
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
|
||||
}--Block id [ZSLJTOI] ,dir,x,y
|
||||
swap={
|
||||
none={2,1,d=function()end},
|
||||
flash={8,1,d=function()gc.clear(1,1,1)end},
|
||||
deck={50,8,d=function()
|
||||
local t=sceneSwaping.time
|
||||
gc.setColor(1,1,1)
|
||||
if t>8 then
|
||||
local t=max(t,15)
|
||||
for i=1,51-t do
|
||||
local bn=swapDeck_data[i][1]
|
||||
local b=blocks[bn][swapDeck_data[i][2]]
|
||||
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
|
||||
for y=1,#b do for x=1,#b[1]do
|
||||
if b[y][x]>0 then
|
||||
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
|
||||
end
|
||||
end end
|
||||
end
|
||||
end
|
||||
if t<17 then
|
||||
gc.setColor(1,1,1,(8-abs(t-8))*.125)
|
||||
gc.rectangle("fill",0,0,1280,720)
|
||||
end
|
||||
local gc=love.graphics
|
||||
local mt=love.math
|
||||
local setFont=setFont
|
||||
local Timer=love.timer.getTime
|
||||
|
||||
local attackColor={
|
||||
{color.darkGrey,color.white},
|
||||
{color.grey,color.white},
|
||||
{color.lightPurple,color.white},
|
||||
{color.lightRed,color.white},
|
||||
{color.darkGreen,color.cyan},
|
||||
}
|
||||
local frameColor={
|
||||
[0]=color.white,
|
||||
color.lightGreen,
|
||||
color.lightBlue,
|
||||
color.lightPurple,
|
||||
color.lightOrange,
|
||||
}
|
||||
local modeLevelColor={
|
||||
EASY=color.cyan,
|
||||
NORMAL=color.green,
|
||||
HARD=color.magenta,
|
||||
["HARD+"]=color.darkMagenta,
|
||||
LUNATIC=color.red,
|
||||
EXTRA=color.lightMagenta,
|
||||
ULTIMATE=color.lightYellow,
|
||||
|
||||
MESS=color.lightGrey,
|
||||
GM=color.blue,
|
||||
DEATH=color.lightRed,
|
||||
CTWC=color.lightBlue,
|
||||
["10L"]=color.cyan,
|
||||
["20L"]=color.lightBlue,
|
||||
["40L"]=color.green,
|
||||
["100L"]=color.orange,
|
||||
["400L"]=color.red,
|
||||
["1000L"]=color.darkRed,
|
||||
}
|
||||
|
||||
local miniTitle_rect={
|
||||
{2,0,5,1},{4,1,1,6},
|
||||
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
|
||||
{15,0,3,1},{15,6,3,1},{14,0,1,7},
|
||||
{19,0,1,7},{23,0,1,7},{20,3,3,1},
|
||||
{0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1},
|
||||
{8,8,5,1},{8,13,5,1},{10,9,1,4},
|
||||
{14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1},
|
||||
{21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4},
|
||||
}
|
||||
local function stencil_miniTitle()
|
||||
for i=1,#miniTitle_rect do
|
||||
gc.rectangle("fill",unpack(miniTitle_rect[i]))
|
||||
end
|
||||
},
|
||||
}--Scene swapping animations
|
||||
end
|
||||
local function stencil_field()
|
||||
gc.rectangle("fill",0,-10,300,610)
|
||||
end
|
||||
local function stencil_field_small()
|
||||
gc.rectangle("fill",0,0,60,120)
|
||||
end
|
||||
|
||||
FX={
|
||||
flash=0,--Black screen(frame)
|
||||
shake=0,--Screen shake(frame)
|
||||
@@ -87,7 +112,7 @@ FX={
|
||||
zoomout=function(t,a)
|
||||
gc.push("transform")
|
||||
setFont(t.font)
|
||||
local k=t.t^.5*.2+1
|
||||
local k=t.t^.5*.1+1
|
||||
gc.translate(150,290+t.dy)
|
||||
gc.scale(k,k)
|
||||
gc.setColor(1,1,1,a)
|
||||
@@ -109,38 +134,35 @@ FX={
|
||||
}
|
||||
|
||||
function updateButton()
|
||||
for i=1,#Buttons[scene]do
|
||||
local B=Buttons[scene][i]
|
||||
local t=i==Buttons.sel and .4 or 0
|
||||
for k,B in next,Buttons[scene]do
|
||||
local t=B==Buttons.sel and .4 or 0
|
||||
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
|
||||
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
|
||||
end
|
||||
end
|
||||
function drawButton()
|
||||
for i=1,#Buttons[scene]do
|
||||
local B=Buttons[scene][i]
|
||||
for k,B in next,Buttons[scene]do
|
||||
if not(B.hide and B.hide())then
|
||||
local C=B.rgb or color.white
|
||||
gc.setColor(C[1],C[2],C[3],B.alpha)
|
||||
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
|
||||
gc.setColor(C)
|
||||
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
|
||||
gc.setColor(C[1],C[2],C[3],.3)
|
||||
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
|
||||
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
|
||||
local t=B.t
|
||||
local y0
|
||||
if t then
|
||||
if type(t)=="function"then t=t()end
|
||||
setFont(B.f or 40)
|
||||
y0=B.y-7-currentFont*.5
|
||||
mStr(t,B.x-1,y0)
|
||||
mStr(t,B.x+1,y0)
|
||||
mStr(t,B.x-1,y0+2)
|
||||
mStr(t,B.x+1,y0+2)
|
||||
end
|
||||
gc.setColor(C)
|
||||
if t then
|
||||
y0=B.y-currentFont*.64
|
||||
gc.printf(t,B.x-201,y0+2,400,"center")
|
||||
gc.printf(t,B.x-199,y0+2,400,"center")
|
||||
gc.printf(t,B.x-201,y0,400,"center")
|
||||
gc.printf(t,B.x-199,y0,400,"center")
|
||||
gc.setColor(C)
|
||||
mStr(t,B.x,y0+1)
|
||||
end
|
||||
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -151,16 +173,16 @@ function drawDial(x,y,speed)
|
||||
gc.setColor(1,1,1,.6)
|
||||
gc.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4)
|
||||
end
|
||||
function drawPixel(y,x,id,alpha)
|
||||
gc.setColor(1,1,1,alpha)
|
||||
function drawPixel(y,x,id)
|
||||
gc.draw(blockSkin[id],30*x-30,600-30*y)
|
||||
end
|
||||
function drawAtkPointer(x,y)
|
||||
gc.setColor(0,.6,1,.35+sin(Timer()*20)*.2)
|
||||
local t=sin(Timer()*20)
|
||||
gc.setColor(.2,.7+t*.2,1,.6+t*.4)
|
||||
gc.circle("fill",x,y,25,6)
|
||||
local a=Timer()*3%1*.8
|
||||
gc.setColor(0,.6,1,.8-a)
|
||||
gc.circle("line",x,y,25*(1+a),6)
|
||||
gc.circle("line",x,y,30*(1+a),6)
|
||||
end
|
||||
|
||||
function VirtualkeyPreview()
|
||||
@@ -177,7 +199,7 @@ function drawVirtualkey()
|
||||
local P=players[1]
|
||||
for i=1,#virtualkey do
|
||||
local p,b=virtualkeyDown[i],virtualkey[i]
|
||||
if p then gc.setColor(.75,.75,.75,a)
|
||||
if p then gc.setColor(.7,.7,.7,a)
|
||||
else gc.setColor(1,1,1,a)
|
||||
end
|
||||
gc.setLineWidth(b[4]*.07)
|
||||
@@ -190,58 +212,56 @@ function drawVirtualkey()
|
||||
end
|
||||
end
|
||||
|
||||
Pnt={}
|
||||
Pnt.BG={
|
||||
none=function()
|
||||
gc.clear(.2,.2,.2)
|
||||
end,
|
||||
glow=function()
|
||||
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
|
||||
gc.clear(t,t,t)
|
||||
end,
|
||||
game1=function()
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(background1,640,360,Timer()*.15,12,nil,64,64)
|
||||
end,
|
||||
game2=function()
|
||||
gc.setColor(1,.5,.5)
|
||||
gc.draw(background1,640,360,Timer()*.2,12,nil,64,64)
|
||||
end,
|
||||
game3=function()
|
||||
gc.setColor(.6,.6,1)
|
||||
gc.draw(background1,640,360,Timer()*.25,12,nil,64,64)
|
||||
end,
|
||||
rgb=function()
|
||||
gc.clear(
|
||||
sin(Timer()*1.2)*.15+.5,
|
||||
sin(Timer()*1.5)*.15+.5,
|
||||
sin(Timer()*1.9)*.15+.5
|
||||
)
|
||||
end,
|
||||
strap=function()
|
||||
gc.setColor(1,1,1)
|
||||
local x=Timer()%32*40
|
||||
gc.draw(background2,x,0,nil,10)
|
||||
gc.draw(background2,x-1280,0,nil,10)
|
||||
end,
|
||||
matrix=function()
|
||||
for i=0,15 do
|
||||
for j=0,8 do
|
||||
-- local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3
|
||||
local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2
|
||||
gc.setColor(t,t,t)
|
||||
gc.rectangle("fill",80*i,80*j,80,80)
|
||||
end
|
||||
Pnt={BG={}}
|
||||
function Pnt.BG.none()
|
||||
gc.clear(.15,.15,.15)
|
||||
end
|
||||
function Pnt.BG.glow()
|
||||
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
|
||||
gc.clear(t,t,t)
|
||||
end
|
||||
function Pnt.BG.game1()
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(background1,640,360,Timer()*.15,12,nil,64,64)
|
||||
end
|
||||
function Pnt.BG.game2()
|
||||
gc.setColor(1,.5,.5)
|
||||
gc.draw(background1,640,360,Timer()*.2,12,nil,64,64)
|
||||
end
|
||||
function Pnt.BG.game3()
|
||||
gc.setColor(.6,.6,1)
|
||||
gc.draw(background1,640,360,Timer()*.25,12,nil,64,64)
|
||||
end
|
||||
function Pnt.BG.rgb()
|
||||
gc.clear(
|
||||
sin(Timer()*1.2)*.15+.5,
|
||||
sin(Timer()*1.5)*.15+.5,
|
||||
sin(Timer()*1.9)*.15+.5
|
||||
)
|
||||
end
|
||||
function Pnt.BG.strap()
|
||||
gc.setColor(1,1,1)
|
||||
local x=Timer()%32*40
|
||||
gc.draw(background2,x,0,nil,10)
|
||||
gc.draw(background2,x-1280,0,nil,10)
|
||||
end
|
||||
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end
|
||||
function Pnt.BG.matrix()
|
||||
for i=0,15 do
|
||||
for j=0,8 do
|
||||
local t=sin(matrixT[i][j]*Timer())*.2+.2
|
||||
gc.setColor(1,1,1,t)
|
||||
gc.rectangle("fill",80*i,80*j,80,80)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
function Pnt.load()
|
||||
gc.setLineWidth(4)
|
||||
gc.setColor(1,1,1,.5)
|
||||
gc.rectangle("fill",300,330,loadprogress*680,60)
|
||||
gc.rectangle("fill",300,330,loadprogress*680,60,5)
|
||||
gc.setColor(1,1,1)
|
||||
gc.rectangle("line",300,330,680,60)
|
||||
gc.rectangle("line",300,330,680,60,5)
|
||||
setFont(40)
|
||||
mStr(text.load[loading],640,335)
|
||||
setFont(25)
|
||||
@@ -256,20 +276,19 @@ function Pnt.intro()
|
||||
gc.setColor(1,1,1,min(count,80)*.005)
|
||||
gc.rectangle("fill",0,0,26,14)
|
||||
gc.pop()
|
||||
gc.setColor(1,1,1)
|
||||
gc.setColor(1,1,1,.125)
|
||||
for i=19,5,-2 do
|
||||
gc.setColor(1,1,1,.06)
|
||||
for i=41,5,-2 do
|
||||
gc.setLineWidth(i)
|
||||
gc.line(250+(count-80)*25,150,(count-80)*25-150,570)
|
||||
gc.line(200+(count-80)*25,130,(count-80)*25,590)
|
||||
end
|
||||
gc.setStencilTest()
|
||||
end
|
||||
function Pnt.main()
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(titleImage,300,30)
|
||||
setFont(30)
|
||||
gc.print("Alpha V0.7.9",370,140)
|
||||
gc.print(system,530,110)
|
||||
gc.draw(titleImage,30,30)
|
||||
gc.print("Alpha V0.7.13+",290,140)
|
||||
gc.print(system,800,110)
|
||||
end
|
||||
function Pnt.mode()
|
||||
setFont(40)
|
||||
@@ -291,23 +310,22 @@ function Pnt.mode()
|
||||
end
|
||||
end
|
||||
function Pnt.custom()
|
||||
gc.setColor(1,1,1,.3+sin(Timer()*8)*.2)
|
||||
gc.rectangle("fill",25,95+40*optSel,465,40)
|
||||
setFont(80)
|
||||
gc.setColor(color.lightGrey)
|
||||
gc.print(text.custom,20,20)
|
||||
gc.setColor(color.white)
|
||||
gc.print(text.custom,22,23)
|
||||
gc.setColor(.8,.8,.8)gc.print(text.custom,20,20)
|
||||
gc.setColor(1,1,1)gc.print(text.custom,22,23)
|
||||
setFont(40)
|
||||
for i=1,#customID do
|
||||
local k=customID[i]
|
||||
local y=90+40*i
|
||||
gc.print(customOption[k],50,y)
|
||||
if customVal[k]then
|
||||
gc.print(customVal[k][customSel[k]],350,y)
|
||||
gc.printf(text.customOption[k],30,y,320,"right")
|
||||
if text.customVal[k]then
|
||||
gc.print(text.customVal[k][customSel[k]],350,y)
|
||||
else
|
||||
gc.print(customRange[k][customSel[k]],350,y)
|
||||
end
|
||||
end
|
||||
gc.print("→",10,90+40*optSel)
|
||||
end
|
||||
function Pnt.play()
|
||||
for p=1,#players do
|
||||
@@ -356,54 +374,82 @@ function Pnt.play()
|
||||
gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Black Background
|
||||
gc.setLineWidth(7)
|
||||
gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame
|
||||
gc.translate(150,70)
|
||||
if P.gameEnv.grid then
|
||||
gc.setLineWidth(1)
|
||||
gc.setColor(1,1,1,.2)
|
||||
for x=1,9 do gc.line(30*x,-10,30*x,600)end
|
||||
for y=0,19 do gc.line(0,30*y,300,30*y)end
|
||||
end
|
||||
gc.stencil(stencil_field,"replace", 1)
|
||||
gc.translate(150,70+P.fieldBeneath)
|
||||
gc.translate(0,P.fieldBeneath)
|
||||
gc.setStencilTest("equal",1)
|
||||
local h=#P.clearing
|
||||
for j=int(P.fieldBeneath/30+1),#P.field do
|
||||
if P.falling<=0 or without(P.clearing,j)then
|
||||
for i=1,10 do
|
||||
if P.field[j][i]>0 then
|
||||
drawPixel(j,i,P.field[j][i],min(P.visTime[j][i],20)*.05)
|
||||
end
|
||||
end
|
||||
else
|
||||
if j==P.clearing[h]and P.falling>-1 then
|
||||
h=h-1
|
||||
gc.setColor(1,1,1,P.falling/P.gameEnv.fall)
|
||||
gc.rectangle("fill",0,600-30*j,320,30)
|
||||
else
|
||||
for i=1,10 do
|
||||
if P.field[j][i]>0 then
|
||||
gc.setColor(1,1,1,min(P.visTime[j][i],20)*.05)
|
||||
drawPixel(j,i,P.field[j][i])
|
||||
end
|
||||
end
|
||||
end
|
||||
end--Field
|
||||
if P.waiting<=0 then
|
||||
for i=1,#P.shade do
|
||||
local S=P.shade[i]
|
||||
gc.setColor(1,1,1,.15+S[1]*.08)
|
||||
for x=S[3],S[5]do
|
||||
for y=S[6],S[4]do
|
||||
drawPixel(y,x,S[2])
|
||||
end
|
||||
end
|
||||
end
|
||||
if P.waiting==-1 then
|
||||
if P.gameEnv.ghost then
|
||||
gc.setColor(1,1,1,.3)
|
||||
for i=1,P.r do for j=1,P.c do
|
||||
if P.cb[i][j]>0 then
|
||||
drawPixel(i+P.y_img-1,j+P.cx-1,P.bc,.3)
|
||||
if P.cur.bk[i][j]then
|
||||
drawPixel(i+P.y_img-1,j+P.curX-1,P.cur.color)
|
||||
end
|
||||
end end
|
||||
end--Ghost
|
||||
gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock)
|
||||
for i=1,P.r do for j=1,P.c do
|
||||
if P.cb[i][j]>0 then
|
||||
gc.rectangle("fill",30*(j+P.cx-1)-34,596-30*(i+P.cy-1),38,38)
|
||||
end
|
||||
end end--BlockShade(lockdelay indicator)
|
||||
for i=1,P.r do for j=1,P.c do
|
||||
if P.cb[i][j]>0 then
|
||||
drawPixel(i+P.cy-1,j+P.cx-1,P.bc,1)
|
||||
end
|
||||
end end--Block
|
||||
if P.gameEnv.block then
|
||||
gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock)
|
||||
for i=1,P.r do for j=1,P.c do
|
||||
if P.cur.bk[i][j]then
|
||||
gc.rectangle("fill",30*(j+P.curX-1)-33,597-30*(i+P.curY-1),36,36)
|
||||
end
|
||||
end end--BlockShade(lockdelay indicator)
|
||||
gc.setColor(1,1,1)
|
||||
for i=1,P.r do for j=1,P.c do
|
||||
if P.cur.bk[i][j]then
|
||||
drawPixel(i+P.curY-1,j+P.curX-1,P.cur.color)
|
||||
end
|
||||
end end--Block
|
||||
end
|
||||
if P.gameEnv.center then
|
||||
local x=30*(P.cx+P.sc[2]-1)-30+15
|
||||
gc.draw(spinCenter,x,600-30*(P.cy+P.sc[1]-1)+15,nil,nil,nil,4,4)
|
||||
gc.setColor(1,1,1)
|
||||
local x=30*(P.curX+P.sc[2]-1)-30+15
|
||||
gc.draw(spinCenter,x,600-30*(P.curY+P.sc[1]-1)+15,nil,nil,nil,4,4)
|
||||
gc.setColor(1,1,1,.5)
|
||||
gc.draw(spinCenter,x,600-30*(P.y_img+P.sc[1]-1)+15,nil,nil,nil,4,4)
|
||||
end--Rotate center
|
||||
end
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(PTC.dust[p])--Draw game field
|
||||
gc.draw(PTC.dust[p])
|
||||
--Draw game field
|
||||
gc.setStencilTest()--In-playField mask
|
||||
gc.translate(0,-P.fieldBeneath)
|
||||
gc.setLineWidth(3)
|
||||
gc.setColor(1,1,1)gc.rectangle("line",-1,-11,302,612)--Draw boarder
|
||||
gc.setColor(1,1,1)
|
||||
gc.rectangle("line",-1,-11,302,612)--Draw boarder
|
||||
|
||||
gc.setLineWidth(2)
|
||||
gc.rectangle("line",301,0,16,601.5)--Draw atkBuffer boarder
|
||||
local h=0
|
||||
for i=1,#P.atkBuffer do
|
||||
local a=P.atkBuffer[i]
|
||||
@@ -416,59 +462,63 @@ function Pnt.play()
|
||||
end
|
||||
if a.countdown>0 then
|
||||
gc.setColor(attackColor[a.lv][1])
|
||||
gc.rectangle("fill",304,600-h,12,-bar+3)
|
||||
gc.rectangle("fill",304,599-h,11,-bar+3)
|
||||
gc.setColor(attackColor[a.lv][2])
|
||||
gc.rectangle("fill",304,600-h+(-bar+3),12,-(-bar+3)*(1-a.countdown/a.cd0))
|
||||
gc.rectangle("fill",304,599-h+(-bar+3),11,-(-bar+3)*(1-a.countdown/a.cd0))
|
||||
--Timing
|
||||
else
|
||||
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
|
||||
gc.rectangle("fill",304,600-h,12,-bar+3)
|
||||
local t=sin((Timer()-i)*30)*.5+.5
|
||||
local c1,c2=attackColor[a.lv][1],attackColor[a.lv][2]
|
||||
gc.setColor(c1[1]*t+c2[1]*(1-t),c1[2]*t+c2[2]*(1-t),c1[3]*t+c2[3]*(1-t))
|
||||
gc.rectangle("fill",304,599-h,11,-bar+3)
|
||||
--Warning
|
||||
end
|
||||
else
|
||||
gc.setColor(attackColor[a.lv][1])
|
||||
bar=bar*(20-a.time)*.05
|
||||
gc.rectangle("fill",304,600-h,12,-bar+2)
|
||||
gc.rectangle("fill",304,599-h,11,-bar+2)
|
||||
--Disappear
|
||||
end
|
||||
h=h+bar
|
||||
end--Buffer line
|
||||
|
||||
gc.setColor(P.b2b<40 and color.white or P.b2b<=480 and color.lightRed or color.lightBlue)
|
||||
gc.rectangle("fill",-13,600,10,-P.b2b1)
|
||||
gc.setColor(color.red)
|
||||
gc.rectangle("fill",-19,600-40,16,5)
|
||||
gc.setColor(color.blue)
|
||||
gc.rectangle("fill",-19,600-480,16,5)
|
||||
--B2B bar
|
||||
|
||||
setFont(40)
|
||||
local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end
|
||||
gc.setColor(.8,1,.2)
|
||||
gc.rectangle("fill",-15,599.5,11,-b*.5)
|
||||
gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue)
|
||||
gc.rectangle("fill",-15,599.5,11,-a*.5)
|
||||
gc.setColor(1,1,1,.5+sin(Timer()*30)*.5)
|
||||
gc.rectangle("fill",-16,b<40 and 578.5 or 98.5,13,3)
|
||||
gc.setColor(1,1,1)
|
||||
gc.rectangle("line",-17,-3,16,604.5)--Draw b2b bar boarder
|
||||
--B2B indictator
|
||||
|
||||
if P.gameEnv.hold then
|
||||
gc.print("Hold",-115,-10)
|
||||
for i=1,#P.hb do
|
||||
for j=1,#P.hb[1] do
|
||||
if P.hb[i][j]>0 then
|
||||
drawPixel(i+17.5-#P.hb*.5,j-2.5-#P.hb[1]*.5,P.holded and 13 or P.hid,1)
|
||||
gc.draw(drawableText.hold,-75-drawableText.hold:getWidth()*.5,-10)
|
||||
gc.setColor(1,1,1)
|
||||
for i=1,#P.hold.bk do
|
||||
for j=1,#P.hold.bk[1] do
|
||||
if P.hold.bk[i][j]then
|
||||
drawPixel(i+17.5-#P.hold.bk*.5,j-2.5-#P.hold.bk[1]*.5,P.holded and 9 or P.hold.color)
|
||||
end
|
||||
end
|
||||
end
|
||||
end--Hold
|
||||
gc.print("Next",336,-10)
|
||||
for N=1,P.gameEnv.next do
|
||||
local b=P.nb[N]
|
||||
for i=1,#b do
|
||||
for j=1,#b[1] do
|
||||
if b[i][j]>0 then
|
||||
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,P.nxt[N],1)
|
||||
end
|
||||
gc.draw(drawableText.next,382-drawableText.next:getWidth()*.5,-10)
|
||||
local N=1
|
||||
::L::
|
||||
local b,c=P.next[N].bk,P.next[N].color
|
||||
gc.setColor(1,1,1)
|
||||
for i=1,#b do for j=1,#b[1] do
|
||||
if b[i][j]then
|
||||
drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c)
|
||||
end
|
||||
end
|
||||
end--Next
|
||||
setFont(30)
|
||||
end end
|
||||
N=N+1
|
||||
if N<=P.gameEnv.next and P.next[N]then goto L end
|
||||
--Next
|
||||
gc.setColor(.8,.8,.8)
|
||||
gc.print(curMode.modeName,-135,-65)
|
||||
gc.printf(curMode.levelName,240,-65,200,"right")
|
||||
gc.draw(drawableText.modeName,-135,-65)
|
||||
gc.draw(drawableText.levelName,437-drawableText.levelName:getWidth(),-65)
|
||||
if frame<180 then
|
||||
local count=179-frame
|
||||
gc.push("transform")
|
||||
@@ -489,9 +539,8 @@ function Pnt.play()
|
||||
if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message
|
||||
|
||||
gc.setColor(1,1,1)
|
||||
setFont(15)
|
||||
gc.print("BPM",390,490)
|
||||
gc.print("KPM",350,583)
|
||||
gc.draw(drawableText.bpm,390,490)
|
||||
gc.draw(drawableText.kpm,350,583)
|
||||
setFont(30)
|
||||
drawDial(360,520,P.dropSpeed)
|
||||
drawDial(405,575,P.keySpeed)
|
||||
@@ -508,18 +557,16 @@ function Pnt.play()
|
||||
end
|
||||
end--Draw players
|
||||
gc.setColor(1,1,1)
|
||||
for i=1,3 do
|
||||
gc.draw(PTC.attack[i])
|
||||
end
|
||||
if setting.virtualkeySwitch then
|
||||
drawVirtualkey()
|
||||
end
|
||||
gc.draw(PTC.attack[1])
|
||||
gc.draw(PTC.attack[2])
|
||||
gc.draw(PTC.attack[3])
|
||||
if setting.virtualkeySwitch then drawVirtualkey()end
|
||||
if modeEnv.royaleMode then
|
||||
for i=1,#FX.badge do
|
||||
local b=FX.badge[i]
|
||||
local t=b.t<10 and 0 or b.t<50 and(sin(1.5*(b.t/20-1.5))+1)*.5 or 1
|
||||
local t=b.t<10 and 0 or b.t<50 and .5+sin(1.5*(b.t/20-1.5))*.5 or 1
|
||||
gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1)
|
||||
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,b.size,nil,14,14)
|
||||
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,nil,nil,14,14)
|
||||
end
|
||||
P=players[1]
|
||||
gc.setLineWidth(5)
|
||||
@@ -541,30 +588,31 @@ end
|
||||
function Pnt.setting()
|
||||
gc.setColor(1,1,1)
|
||||
setFont(35)
|
||||
mStr("DAS:"..setting.das,288,158)
|
||||
mStr("ARR:"..setting.arr,503,158)
|
||||
mStr("DAS:"..setting.das,290,278)
|
||||
mStr("ARR:"..setting.arr,506,278)
|
||||
setFont(18)
|
||||
mStr(text.softdropdas..setting.sddas,288,249)
|
||||
mStr(text.softdroparr..setting.sdarr,503,249)
|
||||
mStr(text.softdropdas..setting.sddas,290,361)
|
||||
mStr(text.softdroparr..setting.sdarr,506,361)
|
||||
end
|
||||
function Pnt.setting2()
|
||||
local a=.3+sin(Timer()*15)*.1
|
||||
if keyboardSetting then
|
||||
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1)
|
||||
gc.setColor(1,.5,.5,a)
|
||||
else
|
||||
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1)
|
||||
gc.setColor(.9,.9,.9,a)
|
||||
end
|
||||
gc.rectangle("fill",240,40*keyboardSet-10,200,40)
|
||||
if joystickSetting then
|
||||
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1)
|
||||
gc.setColor(1,.5,.5,a)
|
||||
else
|
||||
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1)
|
||||
gc.setColor(.9,.9,.9,a)
|
||||
end
|
||||
gc.rectangle("fill",440,40*joystickSet-10,200,40)
|
||||
|
||||
gc.setColor(1,1,1)
|
||||
setFont(25)
|
||||
for y=1,13 do
|
||||
mStr(text.actName[y],150,40*y)
|
||||
mStr(text.actName[y],150,40*y-5)
|
||||
for x=1,2 do
|
||||
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3)
|
||||
end
|
||||
@@ -574,8 +622,8 @@ function Pnt.setting2()
|
||||
gc.line(200*x-160,30,200*x-160,550)
|
||||
end
|
||||
gc.line(40,550,640,550)
|
||||
gc.print(text.keyboard,335,1)
|
||||
gc.print(text.joystick,420,1)
|
||||
mStr(text.keyboard,340,0)
|
||||
mStr(text.joystick,540,0)
|
||||
gc.print(text.setting2Help,50,620)
|
||||
setFont(40)
|
||||
gc.print("< P"..curBoard.."/P8 >",430,570)
|
||||
@@ -601,17 +649,21 @@ function Pnt.help()
|
||||
gc.printf(text.help[i],140,15+43*i,1000,"center")
|
||||
end
|
||||
gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
|
||||
gc.draw(payCode,20,20)
|
||||
gc.draw(groupCode,1080,20)
|
||||
gc.setColor(1,1,1,sin(Timer()*10)*.5+.5)
|
||||
setFont(35)
|
||||
mStr(text.support,150,283)
|
||||
setFont(25)
|
||||
mStr(text.group,1170,210)
|
||||
end
|
||||
function Pnt.stat()
|
||||
setFont(35)
|
||||
gc.setColor(1,1,1)
|
||||
for i=1,10 do
|
||||
gc.print(text.stat[i],350,20+40*i)
|
||||
end
|
||||
|
||||
for i=1,10 do gc.print(text.stat[i],350,20+40*i)end
|
||||
gc.print(stat.run,650,60)
|
||||
gc.print(stat.game,650,100)
|
||||
gc.print(format("%0.2f",stat.gametime).."s",650,140)
|
||||
gc.print(format("%0.1fhr",stat.gametime*2.78e-4),650,140)
|
||||
gc.print(stat.piece,650,180)
|
||||
gc.print(stat.row,650,220)
|
||||
gc.print(stat.atk,650,260)
|
||||
@@ -619,6 +671,5 @@ function Pnt.stat()
|
||||
gc.print(stat.rotate,650,340)
|
||||
gc.print(stat.hold,650,380)
|
||||
gc.print(stat.spin,650,420)
|
||||
|
||||
gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
|
||||
end
|
||||
116
texture.lua
116
texture.lua
@@ -1,5 +1,7 @@
|
||||
local N=gc.newImage
|
||||
function C(x,y)
|
||||
local gc=love.graphics
|
||||
local N,c=gc.newImage
|
||||
local function T(s,t)return gc.newText(setFont(s),t)end
|
||||
local function C(x,y)
|
||||
c=gc.newCanvas(x,y)
|
||||
gc.setCanvas(c)
|
||||
return c
|
||||
@@ -17,34 +19,30 @@ for i=1,13 do
|
||||
gc.draw(blockImg,6-6*i,0,nil,.2)
|
||||
blockSkinmini[i]=c
|
||||
end
|
||||
for i=1,13 do
|
||||
end
|
||||
blockImg:release()
|
||||
|
||||
RCPB={10,33,200,33,105,5,105,60}
|
||||
do royaleCtrlPad=C(300,100)
|
||||
gc.setColor(1,1,1)
|
||||
setFont(25)
|
||||
gc.setLineWidth(2)
|
||||
for i=1,4 do
|
||||
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
|
||||
mStr(atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
|
||||
end
|
||||
end
|
||||
|
||||
virtualkeyIcon={}
|
||||
for i=1,10 do
|
||||
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
|
||||
end
|
||||
|
||||
local blockColor={
|
||||
color.red,
|
||||
color.green,
|
||||
color.orange,
|
||||
color.blue,
|
||||
color.magenta,
|
||||
color.yellow,
|
||||
color.cyan,
|
||||
}
|
||||
gc.setColor(1,1,1)
|
||||
mouseBlock={}
|
||||
for i=1,7 do
|
||||
local b=blocks[i][0]
|
||||
mouseBlock[i]=C(#b[1],#b)
|
||||
gc.setColor(blockColor[i])
|
||||
for x=1,#b[1]do for y=1,#b do
|
||||
if b[y][x]==1 then
|
||||
for y=1,#b do for x=1,#b[1]do
|
||||
if b[y][x]then
|
||||
gc.rectangle("fill",x-1,#b-y,1,1)
|
||||
end
|
||||
end end
|
||||
@@ -87,77 +85,21 @@ dialCircle=N("/image/mess/dialCircle.png")
|
||||
dialNeedle=N("/image/mess/dialNeedle.png")
|
||||
badgeIcon=N("/image/mess/badge.png")
|
||||
spinCenter=N("/image/mess/spinCenter.png")
|
||||
lightBulb=N("/image/mess/lightBulb.png")
|
||||
light=N("/image/mess/light.png")
|
||||
|
||||
background1=N("/image/BG/bg1.jpg")
|
||||
background2=N("/image/BG/bg2.png")
|
||||
groupCode=N("/image/mess/groupcode.png")
|
||||
payCode=N("/image/mess/paycode.png")
|
||||
|
||||
c=nil
|
||||
gc.setCanvas()
|
||||
drawableText={
|
||||
bpm=T(15,"BPM"),
|
||||
kpm=T(15,"KPM"),
|
||||
modeName=T(30),
|
||||
levelName=T(30),
|
||||
next=T(40),
|
||||
hold=T(40),
|
||||
}
|
||||
|
||||
sceneInit={
|
||||
load=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
loading=1--Loading mode
|
||||
loadnum=1--Loading counter
|
||||
loadprogress=0--Loading bar(0~1)
|
||||
end,
|
||||
intro=function()
|
||||
curBG="none"
|
||||
count=0
|
||||
keeprun=true
|
||||
end,
|
||||
main=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
collectgarbage()
|
||||
end,
|
||||
mode=function()
|
||||
saveData()
|
||||
modeSel=modeSel or 1
|
||||
levelSel=levelSel or 3
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
custom=function()
|
||||
optSel=optSel or 1
|
||||
curBG="matrix"
|
||||
keeprun=true
|
||||
end,
|
||||
play=function()
|
||||
keeprun=false
|
||||
resetGameData()
|
||||
sysSFX("ready")
|
||||
mouseShow=false
|
||||
end,
|
||||
setting=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
setting2=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
curBoard=1
|
||||
keyboardSet=1
|
||||
joystickSet=1
|
||||
keyboardSetting=false
|
||||
joystickSetting=false
|
||||
end,--Control settings
|
||||
setting3=function()
|
||||
curBG="game1"
|
||||
keeprun=true
|
||||
defaultSel=1
|
||||
sel=nil
|
||||
snapLevel=1
|
||||
end,--Touch setting
|
||||
help=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
stat=function()
|
||||
curBG="none"
|
||||
keeprun=true
|
||||
end,
|
||||
quit=function()
|
||||
love.event.quit()
|
||||
end,
|
||||
}
|
||||
c=gc.setCanvas()
|
||||
174
timer.lua
174
timer.lua
@@ -1,10 +1,12 @@
|
||||
local Timer=love.timer.getTime
|
||||
|
||||
Tmr={}
|
||||
function Tmr.load()
|
||||
if loading==1 then
|
||||
loadnum=loadnum+1
|
||||
loadprogress=loadnum/10
|
||||
if loadnum==5 then
|
||||
--require("load_texture")
|
||||
--require("texture")
|
||||
elseif loadnum==10 then
|
||||
loadnum=1
|
||||
loading=2
|
||||
@@ -13,6 +15,7 @@ function Tmr.load()
|
||||
if loadnum<=#bgm then
|
||||
bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream")
|
||||
bgm[bgm[loadnum]]:setLooping(true)
|
||||
bgm[bgm[loadnum]]:setVolume(0)
|
||||
loadprogress=loadnum/#bgm
|
||||
loadnum=loadnum+1
|
||||
else
|
||||
@@ -69,10 +72,9 @@ function Tmr.play(dt)
|
||||
virtualkeyPressTime[i]=virtualkeyPressTime[i]-1
|
||||
end
|
||||
end
|
||||
for i=1,3 do
|
||||
PTC.attack[i]:update(dt)
|
||||
end
|
||||
|
||||
PTC.attack[1]:update(dt)
|
||||
PTC.attack[2]:update(dt)
|
||||
PTC.attack[3]:update(dt)
|
||||
if frame<180 then
|
||||
if frame==179 then
|
||||
gameStart()
|
||||
@@ -82,24 +84,33 @@ function Tmr.play(dt)
|
||||
for p=1,#players do
|
||||
P=players[p]
|
||||
if P.keyPressing[1]or P.keyPressing[2]then
|
||||
P.moving=P.moving+sgn(P.moving)
|
||||
P.moving=P.moving+(P.moving>0 and 1 or -1)
|
||||
else
|
||||
P.moving=0
|
||||
end
|
||||
end
|
||||
return
|
||||
end--Counting,include pre-das
|
||||
end--Counting,include pre-das,directy RETURN
|
||||
for p=1,#players do
|
||||
P=players[p]
|
||||
if P.timing then P.time=P.time+dt end
|
||||
if P.alive then
|
||||
local v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1
|
||||
v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1
|
||||
--Update speeds
|
||||
if not P.small then
|
||||
local v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1
|
||||
v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1
|
||||
--Update speeds
|
||||
if modeEnv.royaleMode then
|
||||
if P.keyPressing[9]then
|
||||
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
|
||||
else
|
||||
P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if P.ai and P.waiting<=0 then
|
||||
if P.ai and P.waiting==-1 then
|
||||
P.ai.controlDelay=P.ai.controlDelay-1
|
||||
if P.ai.controlDelay==0 then
|
||||
if #P.ai.controls>0 then
|
||||
@@ -110,16 +121,22 @@ function Tmr.play(dt)
|
||||
else
|
||||
AI_getControls(P.ai.controls)
|
||||
P.ai.controlDelay=P.ai.controlDelay0+2
|
||||
if Timer()-P.cstat.point>P.cstat.event then
|
||||
P.cstat.point=Timer()
|
||||
P.cstat.event=P.ai.controlDelay0+rnd(2,10)
|
||||
changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if not P.keepVisible then
|
||||
for j=1,#P.field do for i=1,10 do
|
||||
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
|
||||
end end
|
||||
end--Fresh visible time
|
||||
|
||||
for j=1,#P.field do for i=1,10 do
|
||||
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
|
||||
end end
|
||||
--Fresh visible time
|
||||
if P.keyPressing[1]or P.keyPressing[2]then
|
||||
P.moving=P.moving+sgn(P.moving)
|
||||
P.moving=P.moving+(P.moving>0 and 1 or -1)
|
||||
local d=abs(P.moving)-P.gameEnv.das
|
||||
if d>1 then
|
||||
if P.gameEnv.arr>0 then
|
||||
@@ -134,8 +151,8 @@ function Tmr.play(dt)
|
||||
P.moving=0
|
||||
end
|
||||
if P.keyPressing[7]and not P.keyPressing[9]then
|
||||
P.downing=P.downing+1
|
||||
local d=abs(P.downing)-P.gameEnv.sddas
|
||||
P.downing=P.downing+1
|
||||
if d>1 then
|
||||
if P.gameEnv.sdarr>0 then
|
||||
if d%P.gameEnv.sdarr==0 then
|
||||
@@ -148,76 +165,82 @@ function Tmr.play(dt)
|
||||
else
|
||||
P.downing=0
|
||||
end
|
||||
if modeEnv.royaleMode then
|
||||
if P.keyPressing[9]then
|
||||
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
|
||||
else
|
||||
P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
|
||||
end
|
||||
end
|
||||
if P.falling>0 then
|
||||
if P.falling>=0 then
|
||||
P.falling=P.falling-1
|
||||
if P.falling<=0 then
|
||||
if #P.field>P.clearing[1]then SFX("fall")end
|
||||
for i=1,#P.clearing do
|
||||
removeRow(P.field,P.clearing[i])
|
||||
removeRow(P.visTime,P.clearing[i])
|
||||
end
|
||||
::L::if P.clearing[1]then
|
||||
rem(P.clearing)
|
||||
goto L
|
||||
end
|
||||
if P.falling>=0 then goto stop end
|
||||
if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
|
||||
for i=1,#P.clearing do
|
||||
removeRow(P.field,P.clearing[i])
|
||||
removeRow(P.visTime,P.clearing[i])
|
||||
end
|
||||
elseif P.waiting>0 then
|
||||
::L::
|
||||
rem(P.clearing)
|
||||
if P.clearing[1]then goto L end
|
||||
end
|
||||
if P.waiting>=0 then
|
||||
P.waiting=P.waiting-1
|
||||
if P.waiting<=0 then
|
||||
resetblock()
|
||||
if P.waiting==-1 then resetblock()end
|
||||
goto stop
|
||||
end
|
||||
if P.curY~=P.y_img then
|
||||
if P.dropDelay>=0 then
|
||||
P.dropDelay=P.dropDelay-1
|
||||
if P.dropDelay>=0 then goto stop end
|
||||
end
|
||||
drop()
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
if P.freshTime<=P.gameEnv.freshLimit then
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
end
|
||||
else
|
||||
if P.cy~=P.y_img then
|
||||
if P.dropDelay>0 then
|
||||
P.dropDelay=P.dropDelay-1
|
||||
else
|
||||
drop()
|
||||
P.dropDelay=P.gameEnv.drop
|
||||
if P.freshTime<=P.gameEnv.freshLimit then
|
||||
P.lockDelay=P.gameEnv.lock
|
||||
end
|
||||
end
|
||||
else
|
||||
if P.lockDelay>0 then P.lockDelay=P.lockDelay-1
|
||||
else drop()
|
||||
end
|
||||
end
|
||||
P.lockDelay=P.lockDelay-1
|
||||
if P.lockDelay>=0 then goto stop end
|
||||
drop()
|
||||
end
|
||||
::stop::
|
||||
if P.b2b1==P.b2b then
|
||||
elseif P.b2b1<P.b2b then
|
||||
P.b2b1=min(P.b2b1*.98+P.b2b*.02+.4,P.b2b)
|
||||
else
|
||||
P.b2b1=max(P.b2b1*.95+P.b2b*.05-.6,P.b2b)
|
||||
end
|
||||
P.b2b1=P.b2b1*.92+P.b2b*.08
|
||||
--Alive
|
||||
else
|
||||
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
|
||||
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
|
||||
--Final average speeds
|
||||
if P.falling>0 then
|
||||
P.falling=P.falling-1
|
||||
if P.falling<=0 then
|
||||
if #P.field>P.clearing[1]then
|
||||
SFX("fall")
|
||||
if P.id==1 then VIB(1)end
|
||||
end
|
||||
for i=1,#P.clearing do
|
||||
removeRow(P.field,P.clearing[i])
|
||||
removeRow(P.visTime,P.clearing[i])
|
||||
end
|
||||
P.clearing={}
|
||||
if not P.small then
|
||||
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
|
||||
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
|
||||
--Final average speeds
|
||||
if modeEnv.royaleMode then
|
||||
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
|
||||
end
|
||||
end--Rows cleared drop
|
||||
end
|
||||
if P.falling>=0 then
|
||||
P.falling=P.falling-1
|
||||
if P.falling>=0 then goto stop end
|
||||
if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
|
||||
for i=1,#P.clearing do
|
||||
removeRow(P.field,P.clearing[i])
|
||||
removeRow(P.visTime,P.clearing[i])
|
||||
end
|
||||
::L::
|
||||
rem(P.clearing)
|
||||
if P.clearing[1]then goto L end
|
||||
end::stop::
|
||||
if P.endCounter<40 then
|
||||
for j=1,#P.field do for i=1,10 do
|
||||
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
|
||||
end end--Make field visible
|
||||
end
|
||||
if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end
|
||||
if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
|
||||
--Dead
|
||||
end
|
||||
for i=#P.shade,1,-1 do
|
||||
local S=P.shade[i]
|
||||
S[1]=S[1]-1
|
||||
if S[1]==0 then
|
||||
rem(P.shade,i)
|
||||
end
|
||||
end
|
||||
for i=#P.bonus,1,-1 do
|
||||
local b=P.bonus[i]
|
||||
if b.inf then
|
||||
@@ -229,9 +252,6 @@ function Tmr.play(dt)
|
||||
if b.t>=60 then rem(P.bonus,i)end
|
||||
end
|
||||
end
|
||||
for i=#P.task,1,-1 do
|
||||
if P.task[i]()then rem(P.task,i)end
|
||||
end
|
||||
for i=#P.atkBuffer,1,-1 do
|
||||
local atk=P.atkBuffer[i]
|
||||
atk.time=atk.time+1
|
||||
@@ -250,5 +270,5 @@ function Tmr.play(dt)
|
||||
PTC.dust[p]:update(dt)
|
||||
end
|
||||
end
|
||||
if modeEnv.royaleMode and frame%60==0 then freshMostDangerous()end
|
||||
if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
|
||||
end
|
||||
247
toolfunc.lua
247
toolfunc.lua
@@ -1,4 +1,8 @@
|
||||
function string.splitS(s,sep)
|
||||
local gc=love.graphics
|
||||
local setFont=setFont
|
||||
local toN,toS=tonumber,tostring
|
||||
|
||||
local function splitS(s,sep)
|
||||
local t={}
|
||||
::L::
|
||||
local i=find(s,sep)or #s+1
|
||||
@@ -7,8 +11,6 @@ function string.splitS(s,sep)
|
||||
if #s~=0 then goto L end
|
||||
return t
|
||||
end
|
||||
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id!
|
||||
function stringPack(s,v)return s..toS(v)end
|
||||
function without(t,v)
|
||||
for i=1,#t do
|
||||
if t[i]==v then return end
|
||||
@@ -38,47 +40,38 @@ function removeRow(t,k)
|
||||
ins(freeRow,rem(t,k))
|
||||
end
|
||||
|
||||
local count=0
|
||||
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
|
||||
function getNewBlock()
|
||||
count=count+1
|
||||
if count==17 then count=1 end
|
||||
local t=BGblockList[count]
|
||||
t.bn,t.size=BGblock.next,2+3*rnd()
|
||||
t.b=blocks[t.bn][rnd(0,3)]
|
||||
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
|
||||
t.y=-#t.b*30*t.size
|
||||
t.v=t.size*(1+rnd())
|
||||
BGblock.next=BGblock.next%7+1
|
||||
return t
|
||||
end
|
||||
--Background animation
|
||||
|
||||
function timeSort(a,b)
|
||||
return a.time>b.time
|
||||
end
|
||||
function stencil_miniTitle()
|
||||
for i=1,#miniTitle_rect do
|
||||
gc.rectangle("fill",unpack(miniTitle_rect[i]))
|
||||
end
|
||||
end
|
||||
function stencil_field()
|
||||
gc.rectangle("fill",150,60,300,610)
|
||||
end
|
||||
function stencil_field_small()
|
||||
gc.rectangle("fill",0,0,60,120)
|
||||
end
|
||||
--Single-usage funcs
|
||||
langName={"中文","English"}
|
||||
local langID={"chi","eng"}
|
||||
function swapLanguage(l)
|
||||
text=require("language/"..langID[l])
|
||||
Buttons.sel=nil
|
||||
for scene,list in pairs(Buttons)do
|
||||
for num=1,#list do
|
||||
list[num].alpha=0
|
||||
list[num].t=text.ButtonText[scene][num]
|
||||
for S,L in next,Buttons do
|
||||
for N,B in next,L do
|
||||
B.alpha=0
|
||||
B.t=text.ButtonText[S][N]
|
||||
end
|
||||
end
|
||||
drawableText.next:set(text.next)
|
||||
drawableText.hold:set(text.hold)
|
||||
if royaleCtrlPad then royaleCtrlPad:release()end
|
||||
gc.push("transform")
|
||||
gc.origin()
|
||||
royaleCtrlPad=gc.newCanvas(300,100)
|
||||
gc.setCanvas(royaleCtrlPad)
|
||||
gc.setColor(1,1,1)
|
||||
setFont(25)
|
||||
gc.setLineWidth(2)
|
||||
for i=1,4 do
|
||||
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
|
||||
mStr(text.atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
|
||||
end
|
||||
gc.setCanvas()
|
||||
gc.pop()
|
||||
collectgarbage()
|
||||
end
|
||||
|
||||
local vibrateLevel={0,0,.03,.04,.05,.07,.9}
|
||||
function VIB(t)
|
||||
if setting.vib>0 then
|
||||
love.system.vibrate(vibrateLevel[setting.vib+t])
|
||||
@@ -118,14 +111,64 @@ function SFX(s,v)
|
||||
end
|
||||
function BGM(s)
|
||||
if setting.bgm and bgmPlaying~=s then
|
||||
for k,v in pairs(bgm)do v:stop()end
|
||||
if s then bgm[s]:play()end
|
||||
if bgmPlaying then newTask(Event_task.bgmFadeOut,nil,bgmPlaying)end
|
||||
for i=1,#Task do
|
||||
if Task[i].code==Event_task.bgmFadeIn then
|
||||
Task[i].code=Event_task.bgmFadeOut
|
||||
end
|
||||
end
|
||||
if s then
|
||||
newTask(Event_task.bgmFadeIn,nil,s)
|
||||
bgm[s]:play()
|
||||
end
|
||||
bgmPlaying=s
|
||||
end
|
||||
end
|
||||
|
||||
local swapDeck_data={
|
||||
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
|
||||
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
|
||||
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
|
||||
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
|
||||
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
|
||||
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
|
||||
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
|
||||
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
|
||||
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
|
||||
}--Block id [ZSLJTOI] ,dir,x,y
|
||||
local swap={
|
||||
none={2,1,d=function()end},
|
||||
flash={8,1,d=function()gc.clear(1,1,1)end},
|
||||
fade={30,15,d=function()
|
||||
local t=1-abs(sceneSwaping.time*.06667-1)
|
||||
gc.setColor(0,0,0,t)
|
||||
gc.rectangle("fill",0,0,1280,720)
|
||||
end},
|
||||
deck={50,8,d=function()
|
||||
local t=sceneSwaping.time
|
||||
gc.setColor(1,1,1)
|
||||
if t>8 then
|
||||
local t=max(t,15)
|
||||
for i=1,51-t do
|
||||
local bn=swapDeck_data[i][1]
|
||||
local b=blocks[bn][swapDeck_data[i][2]]
|
||||
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
|
||||
for y=1,#b do for x=1,#b[1]do
|
||||
if b[y][x]then
|
||||
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
|
||||
end
|
||||
end end
|
||||
end
|
||||
end
|
||||
if t<17 then
|
||||
gc.setColor(1,1,1,(8-abs(t-8))*.125)
|
||||
gc.rectangle("fill",0,0,1280,720)
|
||||
end
|
||||
end},
|
||||
}--Scene swapping animations
|
||||
function gotoScene(s,style)
|
||||
if not sceneSwaping and s~=scene then
|
||||
style=style or"deck"
|
||||
style=style or"fade"
|
||||
sceneSwaping={
|
||||
tar=s,style=style,
|
||||
time=swap[style][1],mid=swap[style][2],
|
||||
@@ -134,6 +177,27 @@ function gotoScene(s,style)
|
||||
Buttons.sel=nil
|
||||
end
|
||||
end
|
||||
|
||||
local prevMenu={
|
||||
load=love.event.quit,
|
||||
intro="quit",
|
||||
main="intro",
|
||||
mode="main",
|
||||
custom="mode",
|
||||
ready="mode",
|
||||
play=function()
|
||||
clearTask("play")
|
||||
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
|
||||
end,
|
||||
help="main",
|
||||
stat="main",
|
||||
setting=function()
|
||||
saveSetting()
|
||||
gotoScene("main")
|
||||
end,
|
||||
setting2="setting",
|
||||
setting3="setting",
|
||||
}
|
||||
function back()
|
||||
local t=prevMenu[scene]
|
||||
if type(t)=="string"then
|
||||
@@ -142,10 +206,46 @@ function back()
|
||||
t()
|
||||
end
|
||||
end
|
||||
|
||||
local dataOpt={
|
||||
"run",
|
||||
"game",
|
||||
"gametime",
|
||||
"piece",
|
||||
"row",
|
||||
"atk",
|
||||
"key",
|
||||
"rotate",
|
||||
"hold",
|
||||
"spin",
|
||||
}
|
||||
local saveOpt={
|
||||
"lang",
|
||||
"ghost",
|
||||
"center",
|
||||
"grid",
|
||||
"swap",
|
||||
"sfx",
|
||||
"bgm",
|
||||
"vib",
|
||||
"fxs",
|
||||
|
||||
"das",
|
||||
"arr",
|
||||
"sddas",
|
||||
"sdarr",
|
||||
|
||||
"fullscreen",
|
||||
"bgblock",
|
||||
"virtualkeyAlpha",
|
||||
"virtualkeyIcon",
|
||||
"virtualkeySwitch",
|
||||
"frameMul",
|
||||
}
|
||||
function loadData()
|
||||
userData:open("r")
|
||||
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
|
||||
local t=string.splitS(userData:read(),"\r\n")
|
||||
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
|
||||
local t=splitS(userData:read(),"\r\n")
|
||||
userData:close()
|
||||
for i=1,#t do
|
||||
local i=t[i]
|
||||
@@ -160,18 +260,11 @@ function loadData()
|
||||
end
|
||||
end
|
||||
function saveData()
|
||||
local t=table.concat({
|
||||
stringPack("run=",stat.run),
|
||||
stringPack("game=",stat.game),
|
||||
stringPack("gametime=",stat.gametime),
|
||||
stringPack("piece=",stat.piece),
|
||||
stringPack("row=",stat.row),
|
||||
stringPack("atk=",stat.atk),
|
||||
stringPack("key=",stat.key),
|
||||
stringPack("rotate=",stat.rotate),
|
||||
stringPack("hold=",stat.hold),
|
||||
stringPack("spin=",stat.spin),
|
||||
},"\r\n")
|
||||
local t={}
|
||||
for i=1,#dataOpt do
|
||||
ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]]))
|
||||
end
|
||||
t=table.concat(t,"\r\n")
|
||||
--t=love.math.compress(t,"zlib"):getString()
|
||||
userData:open("w")
|
||||
userData:write(t)
|
||||
@@ -179,8 +272,8 @@ function saveData()
|
||||
end
|
||||
function loadSetting()
|
||||
userSetting:open("r")
|
||||
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
|
||||
local t=string.splitS(userSetting:read(),"\r\n")
|
||||
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
|
||||
local t=splitS(userSetting:read(),"\r\n")
|
||||
userSetting:close()
|
||||
for i=1,#t do
|
||||
local i=t[i]
|
||||
@@ -195,17 +288,17 @@ function loadSetting()
|
||||
setting.fullscreen=v=="true"
|
||||
love.window.setFullscreen(setting.fullscreen)
|
||||
elseif t=="keymap"then
|
||||
v=string.splitS(v,"/")
|
||||
v=splitS(v,"/")
|
||||
for i=1,16 do
|
||||
local v1=string.splitS(v[i],",")
|
||||
local v1=splitS(v[i],",")
|
||||
for j=1,#v1 do
|
||||
setting.keyMap[i][j]=v1[j]
|
||||
end
|
||||
end
|
||||
elseif t=="keylib"then
|
||||
v=string.splitS(v,"/")
|
||||
v=splitS(v,"/")
|
||||
for i=1,4 do
|
||||
local v1=string.splitS(v[i],",")
|
||||
local v1=splitS(v[i],",")
|
||||
for j=1,#v1 do
|
||||
setting.keyLib[i][j]=toN(v1[j])
|
||||
end
|
||||
@@ -218,10 +311,10 @@ function loadSetting()
|
||||
end
|
||||
end
|
||||
elseif t=="virtualkey"then
|
||||
v=string.splitS(v,"/")
|
||||
v=splitS(v,"/")
|
||||
for i=1,10 do
|
||||
if not v[i]then goto c end
|
||||
virtualkey[i]=string.splitS(v[i],",")
|
||||
virtualkey[i]=splitS(v[i],",")
|
||||
for j=1,4 do
|
||||
virtualkey[i][j]=toN(virtualkey[i][j])
|
||||
end
|
||||
@@ -236,7 +329,7 @@ function loadSetting()
|
||||
elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then
|
||||
v=toN(v)if not v or v<0 then v=0 end
|
||||
setting[t]=int(v)
|
||||
elseif t=="ghost"or t=="center"then
|
||||
elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"then
|
||||
setting[t]=v=="true"
|
||||
elseif t=="lang"then
|
||||
setting[t]=toN(v:match("[12]"))or 1
|
||||
@@ -260,25 +353,15 @@ function saveSetting()
|
||||
for i=1,4 do
|
||||
lib[i]=table.concat(setting.keyLib[i],",")
|
||||
end
|
||||
local t=table.concat({
|
||||
stringPack("lang=",setting.lang),
|
||||
stringPack("sfx=",setting.sfx),
|
||||
stringPack("bgm=",setting.bgm),
|
||||
stringPack("vib=",setting.vib),
|
||||
stringPack("fullscreen=",setting.fullscreen),
|
||||
stringPack("bgblock=",setting.bgblock),
|
||||
stringPack("das=",setting.das),
|
||||
stringPack("arr=",setting.arr),
|
||||
stringPack("sddas=",setting.sddas),
|
||||
stringPack("sdarr=",setting.sdarr),
|
||||
stringPack("keymap=",table.concat(map,"/")),
|
||||
stringPack("keylib=",table.concat(lib,"/")),
|
||||
stringPack("virtualkey=",table.concat(vk,"/")),
|
||||
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
|
||||
stringPack("virtualkeyIcon=",setting.virtualkeyIcon),
|
||||
stringPack("virtualkeySwitch=",setting.virtualkeySwitch),
|
||||
stringPack("frameMul=",setting.frameMul),
|
||||
},"\r\n")
|
||||
local t={
|
||||
"keymap="..toS(table.concat(map,"/")),
|
||||
"keylib="..toS(table.concat(lib,"/")),
|
||||
"virtualkey="..toS(table.concat(vk,"/")),
|
||||
}
|
||||
for i=1,#saveOpt do
|
||||
ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]]))
|
||||
end
|
||||
t=table.concat(t,"\r\n")
|
||||
--t=love.math.compress(t,"zlib"):getString()
|
||||
userSetting:open("w")
|
||||
userSetting:write(t)
|
||||
|
||||
Reference in New Issue
Block a user