Compare commits

...

4 Commits
v0.5 ... v0.7.1

Author SHA1 Message Date
MrZ_26
1447893378 Alpha V0.7.1 2020-02-04 19:29:24 +08:00
MrZ_26
bdee7fba03 Alpha V0.6.8 2020-02-04 19:28:44 +08:00
MrZ_26
d8cbfa72ac Alpha V0.6.5 2020-02-04 19:28:33 +08:00
MrZ_26
31fd2c0e72 Alpha V0.6 2020-02-04 19:28:01 +08:00
36 changed files with 1002 additions and 510 deletions

BIN
BGM/infinite.ogg Normal file

Binary file not shown.

View File

@@ -1,14 +0,0 @@
local count=0
BGblockList={}for i=1,16 do BGblockList[i]={}end
function getNewBlock()
count=count+1
if count==17 then count=1 end
local t=BGblockList[count]
t.bn,t.size=rnd(7),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())
return t
end

BIN
SFX/fail.ogg Normal file

Binary file not shown.

BIN
SFX/win.ogg Normal file

Binary file not shown.

10
ai.lua
View File

@@ -5,7 +5,7 @@ VerticalTransitions
BlockedCells BlockedCells
Wells Wells
FilledLines FilledLines
TetrisShape TechrashShape
BlockedWells; BlockedWells;
]] ]]
dirCount={1,1,3,3,3,0,1} dirCount={1,1,3,3,3,0,1}
@@ -97,17 +97,17 @@ function getScore(field,cb,cx,cy)
for x=1,9 do for x=1,9 do
local dh=abs(height[x]-height[x]) local dh=abs(height[x]-height[x])
if dh>1 then if dh>1 then
rough=rough+min(dh^2,10) rough=rough+min(dh^1.5,10)
end end
end end
ins(freeRow,height) ins(freeRow,height)
return return
-highest*5 -highest*5
-rough*15 -rough*20
-cy*20 -cy*20
-#cb*10 -#cb*10
+clear^2*4 +clear^2*4
-hole*15 -hole*25
end end
function AI_getControls(ctrl) function AI_getControls(ctrl)
local Tfield={}--test field local Tfield={}--test field
@@ -119,7 +119,7 @@ function AI_getControls(ctrl)
end end
end end
local best={x=1,dir=0,hold=false,score=-9e99} local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,1 do for ifhold=0,gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and bn or hn>0 and hn or nxt[1] local bn=ifhold==0 and bn or hn>0 and hn or nxt[1]
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]

View File

@@ -58,38 +58,85 @@ function keyDown.mode(key)
if modeSel>1 then modeSel=modeSel-1 end if modeSel>1 then modeSel=modeSel-1 end
elseif key=="return"then elseif key=="return"then
startGame(modeID[modeSel]) startGame(modeID[modeSel])
elseif key=="c"then
gotoScene("custom")
elseif key=="escape"then
back()
end
end
function keyDown.custom(key)
if key=="left"then
local k=customID[optSel]
customSel[k]=(customSel[k]-2)%#customRange[k]+1
elseif key=="right"then
local k=customID[optSel]
customSel[k]=customSel[k]%#customRange[k]+1
elseif key=="down"then
optSel=optSel%#customID+1
elseif key=="up"then
optSel=(optSel-2)%#customID+1
elseif key=="return"then
startGame("custom")
elseif key=="escape"then elseif key=="escape"then
back() back()
end end
end end
function keyDown.setting2(key) function keyDown.setting2(key)
if key=="escape"then if key=="escape"then
back() if keyboardSetting then
keysetting,gamepadsetting=nil keyboardSetting=false
elseif keysetting then else
setting.key[keysetting]=key back()
keysetting,gamepadsetting=nil end
else elseif keyboardSetting then
buttonControl_key(key) for l=1,8 do
for y=1,12 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
end
end
end
setting.keyMap[curBoard][keyboardSet]=key
keyboardSetting=false
elseif key=="return"then
keyboardSetting=true
elseif key=="up"then
keyboardSet=max(keyboardSet-1,1)
elseif key=="down"then
keyboardSet=min(keyboardSet+1,12)
elseif key=="left"then
curBoard=max(curBoard-1,1)
elseif key=="right"then
curBoard=min(curBoard+1,8)
end end
end end
function keyDown.play(key) function keyDown.play(key)
local k=players[1].gameEnv.key if key=="escape"then back()return nil end
for i=1,11 do local m=setting.keyMap
if key==k[i]then for p=1,4 do
pressKey(i) local lib=setting.keyLib[p]
break for s=1,#lib do
for k=1,12 do
if key==m[lib[s]][k]then
pressKey(k,players[p])
return nil
end
end
end end
end end
if key=="escape"then back()end
end end
keyUp={} keyUp={}
function keyUp.play(key) function keyUp.play(key)
local k=players[1].gameEnv.key local m=setting.keyMap
for i=1,10 do for p=1,4 do
if key==k[i]then local lib=setting.keyLib[p]
releaseKey(i,players[1]) for s=1,#lib do
break for k=1,12 do
if key==m[lib[s]][k]then
releaseKey(k,players[p])
return nil
end
end
end end
end end
end end
@@ -107,32 +154,60 @@ function gamepadDown.mode(key)
end end
function gamepadDown.setting2(key) function gamepadDown.setting2(key)
if key=="back"then if key=="back"then
back() if joystickSetting then
keysetting,gamepadsetting=nil joystickSetting=false
elseif gamepadsetting then else
setting.gamepad[gamepadsetting]=key back()
keysetting,gamepadsetting=nil end
else elseif joystickSetting then
buttonControl_gamepad(key) for l=9,16 do
for y=1,12 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
end
end
end
setting.keyMap[8+curBoard][joystickSet]=key
joystickSetting=false
elseif key=="start"then
joystickSetting=true
elseif key=="up"then
joystickSet=max(joystickSet-1,1)
elseif key=="down"then
joystickSet=min(joystickSet+1,12)
elseif key=="left"then
curBoard=max(curBoard-1,1)
elseif key=="right"then
curBoard=min(curBoard+1,8)
end end
end end
function gamepadDown.play(key) function gamepadDown.play(key)
local k=players[1].gameEnv.gamepad if key=="back"then back()return nil end
for i=1,11 do local m=setting.keyMap
if key==k[i]then for p=1,4 do
pressKey(i) local lib=setting.keyLib[p]
break for s=1,#l[p]do
for k=1,12 do
if key==m[8+lib[s]][k]then
pressKey(k)
return nil
end
end
end end
end end
if key=="escape"then back()end
end end
gamepadUp={} gamepadUp={}
function gamepadUp.play(key) function gamepadUp.play(key)
local k=players[1].gameEnv.gamepad local m=setting.keyMap
for i=1,10 do for p=1,4 do
if key==k[i]then local lib=setting.keyLib[p]
releaseKey(i,players[1]) for s=1,#l[p]do
break for k=1,12 do
if key==m[8+lib[s]][k]then
pressKey(k)
return nil
end
end
end end
end end
end end
@@ -163,7 +238,7 @@ function love.mousepressed(x,y,k,t,num)
if not t then if not t then
mouseShow=true mouseShow=true
mx,my=convert(x,y) mx,my=convert(x,y)
if mouseDown[scene]then mouseDown[scene](mx,my,k)end --if mouseDown[scene]then mouseDown[scene](mx,my,k)end
if k==1 then if k==1 then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] local B=Buttons[scene][Buttons.sel]
@@ -173,7 +248,7 @@ function love.mousepressed(x,y,k,t,num)
love.mousemoved(x,y) love.mousemoved(x,y)
sysSFX("button") sysSFX("button")
end end
elseif k==3 then elseif k==2 then
back() back()
end end
end end
@@ -189,7 +264,15 @@ function love.touchpressed(id,x,y)
if scene=="play"and setting.virtualkeySwitch then if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
pressKey(t) pressKey(t,players[1])
end
elseif scene=="setting3"then
x,y=convert(x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end end
end end
end end
@@ -210,6 +293,13 @@ function love.touchreleased(id,x,y)
if t then if t then
releaseKey(t) releaseKey(t)
end end
elseif scene=="setting3"and sel then
x,y=convert(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
@@ -237,11 +327,9 @@ function love.touchmoved(id,x,y,dx,dy)
elseif scene=="setting3"then elseif scene=="setting3"then
x,y=convert(x,y) x,y=convert(x,y)
dx,dy=dx*screenK,dy*screenK dx,dy=dx*screenK,dy*screenK
for K=1,#virtualkey do if sel then
local b=virtualkey[K] local b=virtualkey[sel]
if (x-b[1])^2+(y-b[2])^2<b[3]then b[1],b[2]=b[1]+dx,b[2]+dy
b[1],b[2]=b[1]+dx,b[2]+dy
end
end end
end end
end end
@@ -251,6 +339,8 @@ function love.keypressed(i)
elseif i=="escape"or i=="back"then back() elseif i=="escape"or i=="back"then back()
else buttonControl_key(i) else buttonControl_key(i)
end end
if i=="f12"then devMode=true end
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
@@ -258,23 +348,6 @@ function love.keyreleased(i)
end end
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
if scene~="play"or scene=="setting2"and not gamepadsetting then
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then
Buttons.sel=1
mouseShow=false
else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
end
elseif i=="start"then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
sysSFX("button")
end
end
end
if gamepadDown[scene]then return gamepadDown[scene](i) if gamepadDown[scene]then return gamepadDown[scene](i)
elseif i=="back"then return back() elseif i=="back"then return back()
else buttonControl_gamepad(i) else buttonControl_gamepad(i)
@@ -284,7 +357,17 @@ function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i) if gamepadUp[scene]then gamepadUp[scene](i)
end end
end end
--[[
function love.joystickpressed(js,k)
end
function love.joystickaxis(js,axis,val)
end
function love.joystickhat(js,hat,dir)
end
]]
function love.wheelmoved(x,y) function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end if wheelmoved[scene]then wheelmoved[scene](x,y)end
end end
@@ -301,10 +384,12 @@ function love.update(dt)
BGblock[i].y=BGblock[i].y+BGblock[i].v BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end if BGblock[i].y>720 then rem(BGblock,i)end
end end
BGblock.ct=BGblock.ct-1 if setting.bgblock then
if BGblock.ct==0 then BGblock.ct=BGblock.ct-1
ins(BGblock,getNewBlock()) if BGblock.ct==0 then
BGblock.ct=rnd(20,30) ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30)
end
end end
--Background blocks update --Background blocks update
@@ -324,6 +409,9 @@ function love.update(dt)
end end
--scene swapping & Timer --scene swapping & Timer
end end
function love.sendData(data)
return nil
end
function love.receiveData(id,data) function love.receiveData(id,data)
return nil return nil
end end
@@ -355,7 +443,10 @@ function love.draw()
setFont(20)gc.setColor(1,1,1) setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),0,700) gc.print(tm.getFPS(),0,700)
gc.print(gcinfo(),0,680) if devMode then
gc.print(gcinfo(),0,680)
gc.print(freeRow and #freeRow or 0,0,660)
end
--if gcinfo()>500 then collectgarbage()end --if gcinfo()>500 then collectgarbage()end
end end
function love.resize(x,y) function love.resize(x,y)
@@ -371,7 +462,7 @@ function love.run()
tm.step() tm.step()
love.resize(nil,gc.getHeight()) love.resize(nil,gc.getHeight())
game.load()--System scene Launch game.load()--System scene Launch
math.randomseed(os.time()*626)--true A-lthour's ID! math.randomseed(os.time()*626)
return function() return function()
love.event.pump() love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do for name,a,b,c,d,e,f in love.event.poll()do
@@ -402,7 +493,7 @@ function love.run()
end end
end end
else else
tm.sleep(.1) tm.sleep(.2)
if wd.hasFocus()then if wd.hasFocus()then
focus=true focus=true
ms.setVisible(false) ms.setVisible(false)

BIN
cb.ttf

Binary file not shown.

View File

@@ -5,11 +5,11 @@ function love.conf(t)
t.version="11.1" t.version="11.1"
t.console=X t.console=X
t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean)
t.gammacorrect=true t.gammacorrect=X
t.audio.mixwithsystem=true--Switch on to keep background music playing t.audio.mixwithsystem=true--Switch on to keep background music playing
local W=t.window local W=t.window
W.title="Techmino V0.5" W.title="Techmino V0.7.1"
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.borderless=X W.borderless=X
@@ -17,7 +17,7 @@ function love.conf(t)
W.minwidth,W.minheight=640,360 W.minwidth,W.minheight=640,360
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
W.fullscreen=X W.fullscreen=X
W.vsync=1 W.vsync=X--0 to set ∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--The number of bits per sample in the depth buffer W.depth=X--The number of bits per sample in the depth buffer
W.stencil=8--The number of bits per sample in the stencil buffer W.stencil=8--The number of bits per sample in the stencil buffer

View File

@@ -1,12 +1,12 @@
function resetGameData() function resetGameData()
if players then restockRow()end--Avoid first start game error
players={alive={}} players={alive={}}
royaleMode=false
loadmode[gamemode]() loadmode[gamemode]()
frame=0 frame=0
count=179 count=179
FX.beam={} FX.beam={}
for i=1,#PTC.dust do PTC.dust[i]=nil end for i=1,#PTC.dust do PTC.dust[i]:release()end
for i=1,#players do for i=1,#players do
PTC.dust[i]=PTC.dust[0]:clone() PTC.dust[i]=PTC.dust[0]:clone()
PTC.dust[i]:start() PTC.dust[i]:start()
@@ -42,10 +42,13 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.control=false P.control=false
P.timing=false P.timing=false
P.time=0 P.time=0
P.cstat={key=0,piece=0,row=0,atk=0,tetris=0}--Current gamestat P.cstat={key=0,piece=0,row=0,atk=0,techrash=0}--Current gamestat
P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0
P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0
P.field,P.visTime,P.atkBuffer={},{},{}
P.badge,P.strength,P.lastRecv=0,0,nil
P.gameEnv={}--Game setting vars,like dropDelay setting P.gameEnv={}--Game setting vars,like dropDelay setting
for k,v in pairs(gameEnv0)do for k,v in pairs(gameEnv0)do
if data and data[k]~=nil then if data and data[k]~=nil then
@@ -59,7 +62,6 @@ function createPlayer(id,x,y,size,AIspeed,data)
end end
end--reset current game settings end--reset current game settings
P.field,P.visTime,P.atkBuffer={},{},{}
P.hn,P.hb,P.holded=0,{{}},false P.hn,P.hb,P.holded=0,{{}},false
P.nxt,P.nb={},{} P.nxt,P.nb={},{}
P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock
@@ -72,12 +74,13 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.nb[i]=blocks[P.nxt[i]][0] P.nb[i]=blocks[P.nxt[i]][0]
end--First bag end--First bag
P.freshNext=randomMethod[P.gameEnv.sequence]
if P.gameEnv.sequence==1 then P.bag={}--Bag7 if P.gameEnv.sequence==1 then P.bag={}--Bag7
elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.nxt[i+3]end--History4 elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.nxt[i+3]end--History4
elseif P.gameEnv.sequence==3 then--Pure random elseif P.gameEnv.sequence==3 then--Pure random
end end
P.showTime=P.gameEnv.visible==1 and 1e99 or P.gameEnv.visible==2 and 300 or 20 P.showTime=P.gameEnv.visible==1 and 1e99 or P.gameEnv.visible==2 and 300 or 20
P.freshNext=randomMethod[P.gameEnv.sequence]
P.cb,P.sc,P.bn,P.r,P.c,P.cx,P.cy,P.dir,P.y_img={{}},{0,0},1,0,0,0,0,0,0 P.cb,P.sc,P.bn,P.r,P.c,P.cx,P.cy,P.dir,P.y_img={{}},{0,0},1,0,0,0,0,0,0
P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
P.moving,P.downing=0,0 P.moving,P.downing=0,0
@@ -89,11 +92,15 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.b2b=0 P.b2b=0
P.b2b1=0 P.b2b1=0
P.counter=0
P.result=nil--string,"win"/"lose"
P.task={} P.task={}
P.bonus={} P.bonus={}
end end
function showText(text,type,font,dy) function showText(text,type,font,dy,inf)
ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0}) if not P.small then
ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0,inf=inf,solid=inf})
end
end end
function createBeam(s,r,lv)--Player id function createBeam(s,r,lv)--Player id
S,R=players[s],players[r] S,R=players[s],players[r]
@@ -110,18 +117,33 @@ function createBeam(s,r,lv)--Player id
end end
ins(FX.beam,{x1,y1,x2,y2,t=0,lv=lv}) ins(FX.beam,{x1,y1,x2,y2,t=0,lv=lv})
end end
function freshgho() function throwBadge(s,r,amount)--Player id
if not P.gameEnv._20G then s,r=players[s],players[r]
P.y_img=P.cy>#field+1 and #field+1 or P.cy local x1,y1,x2,y2
while not ifoverlap(cb,cx,y_img-1)do if s.small then
P.y_img=P.y_img-1 x1,y1=s.x+150*s.size,s.y+300*s.size
end
else else
x1,y1=s.x+308*s.size,s.y+450*s.size
end
if r.small then
x2,y2=r.x+150*r.size,r.y+300*r.size
else
x2,y2=r.x+308*r.size,r.y+450*r.size
end
ins(FX.badge,{x1,y1,x2,y2,t=0,size=(10+min(amount,10))*.1})
end
function freshgho()
if P.gameEnv._20G or keyPressing[7]and gameEnv.sdarr==0 then
while not ifoverlap(cb,cx,cy-1)do while not ifoverlap(cb,cx,cy-1)do
P.cy=P.cy-1 P.cy=P.cy-1
P.spinLast=false P.spinLast=false
end end
P.y_img=P.cy P.y_img=P.cy
else
P.y_img=P.cy>#field+1 and #field+1 or P.cy
while not ifoverlap(cb,cx,y_img-1)do
P.y_img=P.y_img-1
end
end end
end end
function freshLockDelay() function freshLockDelay()
@@ -200,7 +222,7 @@ function pressKey(i,player)
ins(keyTime,1,frame)rem(keyTime,11) ins(keyTime,1,frame)rem(keyTime,11)
cstat.key=cstat.key+1 cstat.key=cstat.key+1
if not player then stat.key=stat.key+1 end if P.id==1 then stat.key=stat.key+1 end
--Key count --Key count
end end
-- if playmode=="recording"then ins(rec,{i,frame})end -- if playmode=="recording"then ins(rec,{i,frame})end
@@ -296,27 +318,29 @@ function drop()
if dospin==0 then dospin=false end if dospin==0 then dospin=false end
lock() lock()
local cc,csend,exblock,sendTime=checkrow(cy,r),0,0,0--Currect clear&send&sendTime local cc,csend,exblock,sendTime=checkrow(cy,r),0,0,0--Currect clear&send&sendTime
local mini=dospin==1 and cc<3 and cc<r local mini=bn~=7 and dospin==1 and cc<3 and cc<r
P.combo=P.combo+1--combo=0 is under P.combo=P.combo+1--combo=0 is under
if cc==4 then if cc==4 then
if b2b>480 then if b2b>500 then
showText("Tetris B2B2B","fly",70) showText("Techrash B2B2B","fly",70)
csend=6 csend=6
sendTime=80
exblock=exblock+1 exblock=exblock+1
elseif b2b>=100 then elseif b2b>=100 then
showText("Tetris B2B","drive",70) showText("Techrash B2B","drive",70)
sendTime=70
csend=5 csend=5
else else
showText("Tetris","stretch",80) showText("Techrash","stretch",80)
sendTime=60
csend=4 csend=4
end end
P.b2b=P.b2b+100 P.b2b=P.b2b+100
sendTime=60 P.cstat.techrash=P.cstat.techrash+1
P.cstat.tetris=P.cstat.tetris+1
elseif cc>0 then elseif cc>0 then
if dospin then if dospin then
if b2b>480 then if b2b>500 then
showText(spinName[cc][bn].." B2B2B","spin",40) showText(spinName[cc][bn].." B2B2B","spin",40)
csend=b2bATK[cc]+1 csend=b2bATK[cc]+1
exblock=exblock+1 exblock=exblock+1
@@ -350,7 +374,7 @@ function drop()
if dospin then if dospin then
showText(spinName[0][bn],"appear",50) showText(spinName[0][bn],"appear",50)
SFX("spin_0") SFX("spin_0")
P.b2b=b2b+40 P.b2b=b2b+30
end end
end end
@@ -360,7 +384,9 @@ function drop()
exblock=exblock+2 exblock=exblock+2
sendTime=sendTime+30 sendTime=sendTime+30
SFX("perfectclear") SFX("perfectclear")
P.b2b=b2b+150 if cstat.piece>10 then
P.b2b=600
end
end end
csend=csend+(renATK[combo]or 4) csend=csend+(renATK[combo]or 4)
@@ -375,11 +401,14 @@ function drop()
P.b2b=max(min(b2b,600),0) P.b2b=max(min(b2b,600),0)
if csend>0 then if csend>0 then
if mini then csend=int(csend*.7)end if exblock then exblock=int(exblock*(1+P.strength*.25))end
--mini attack decrease csend=csend*(1+P.strength*.25)
if mini then csend=csend end
csend=int(csend)
--Buffs
stat.atk=stat.atk+csend
P.cstat.atk=P.cstat.atk+csend P.cstat.atk=P.cstat.atk+csend
if P.id==1 then stat.atk=stat.atk+csend end
--ATK statistics --ATK statistics
while csend>0 and P.atkBuffer[1]do while csend>0 and P.atkBuffer[1]do
@@ -397,10 +426,20 @@ function drop()
P.atkBuffer[1].lv=s<4 and 1 or s<7 and 2 or 3 P.atkBuffer[1].lv=s<4 and 1 or s<7 and 2 or 3
end end
end end
if csend>0 and #players.alive>1 then garbageSend(P.id,csend,sendTime)end if csend>0 then
showText(csend,"zoomout",25,70)
if #players.alive>1 then
garbageSend(P.id,csend,sendTime)
end
end
elseif cc==0 then elseif cc==0 then
if P.b2b>450 then
P.b2b=b2b-10
elseif P.b2b>100 then
P.b2b=max(b2b-6,100)
end
garbageRelease() garbageRelease()
end--Send attack end
if id==1 then if id==1 then
stat.piece,stat.row=stat.piece+1,stat.row+cc stat.piece,stat.row=stat.piece+1,stat.row+cc
end end
@@ -434,6 +473,7 @@ function garbageSend(sender,send,time)
until r~=P.id until r~=P.id
createBeam(sender,r,level) createBeam(sender,r,level)
ins(players[r].atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false,lv=level}) ins(players[r].atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false,lv=level})
players[r].lastRecv=sender
sort(players[r].atkBuffer,timeSort) sort(players[r].atkBuffer,timeSort)
end end
function garbageRelease() function garbageRelease()

BIN
image/block/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 584 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

View File

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 404 B

View File

Before

Width:  |  Height:  |  Size: 882 B

After

Width:  |  Height:  |  Size: 882 B

View File

Before

Width:  |  Height:  |  Size: 973 B

After

Width:  |  Height:  |  Size: 973 B

BIN
image/mess/badge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

349
list.lua
View File

@@ -15,9 +15,16 @@ color={
lightCyan={.5,1,1}, lightCyan={.5,1,1},
lightGrey={.8,.8,.8}, lightGrey={.8,.8,.8},
darkRed={.6,0,0},
darkGreen={0,.6,0},
darkBlue={0,0,.6},
darkYellow={.6,.6,0},
darkPurple={.6,0,.6},
darkCyan={0,.6,.6},
darkGrey={.3,.3,.3}, darkGrey={.3,.3,.3},
white={1,1,1}, white={1,1,1},
orange={1,.6,0} orange={1,.6,0},
} }
attackColor={ attackColor={
{color.red,color.yellow}, {color.red,color.yellow},
@@ -35,6 +42,13 @@ attackColor={
end, end,
}--3 animation-colorsets of attack buffer bar }--3 animation-colorsets of attack buffer bar
} }
frameColor={
[0]=color.white,
color.green,
color.blue,
color.purple,
color.orange,
}
blockName={"Z","S","L","J","T","O","I"} blockName={"Z","S","L","J","T","O","I"}
blockColor={ blockColor={
color.red, color.red,
@@ -57,36 +71,121 @@ for j=1,7 do
spinName[0][j]=blockName[j].." spin" spinName[0][j]=blockName[j].." spin"
end end
sfx={
"button",
"ready","start","win","fail",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"drop","fall",
"reach",
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11",
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
"perfectclear",
}
bgm={
"blank",
"way",
"race",
"push",
"reason",
"infinite",
}
prevMenu={ prevMenu={
load=love.event.quit, load=love.event.quit,
ready="mode", ready="mode",
play="mode", play=function()
gotoScene(gamemode~="custom"and"mode"or"custom")
end,
mode="main", mode="main",
custom="mode",
help="main", help="main",
stat="main", stat="main",
setting="main", setting=function()
saveSetting()
gotoScene("main")
end,
setting2="setting", setting2="setting",
setting3="setting", setting3="setting",
intro="quit", intro="quit",
main="quit", main="quit",
} }
modeID={"sprint","marathon","zen","solo","death","blind","tetris41","asymsolo","gmroll",} modeID={"sprint","marathon","zen","infinite","solo","death","blind","puzzle","techmino41","asymsolo","gmroll","p2","p3","p4"}
modeName={"Sprint","Marathon","Zen","Solo","Death","Blind","Tetris 41","Asymmetry solo","GM roll",} modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Techmino 41","Asymmetry solo","GM roll","2P","3P","4P"}
modeInfo={ modeInfo={
sprint="Clear 40 Lines", sprint="Clear 40 Lines",
marathon="Clear 200 Lines", marathon="Clear 200 Lines",
zen="Clear 200 Lines without gravity", zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI", solo="Beat AI",
death="Survive under terrible speed", death="Survive under terrible speed",
blind="Invisible board!", blind="Invisible board!",
tetris41="Melee fight with 40 AIs", puzzle="Your keyboard broke",
techmino41="Melee fight with 40 AIs",
asymsolo=" See-->", asymsolo=" See-->",
gmroll="Who want to be the grand master?", gmroll="Who want to be the grand master?",
p2="2 players game",
p3="3 players game",
p4="4 players game",
} }
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight","toDown"} customID={
actName_show={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight","toDown"} "drop",
"lock",
"wait",
"fall",
"next",
"hold",
"sequence",
"visible",
"target",
"freshLimit",
"opponent",
}--Order
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:",
}--Key str
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={"bag","his4","random"},
visible={"Show","half","hide"},
target=nil,
freshLimit=nil,
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
}--number-Val str
customRange={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99,-1},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={1,3,5,7,10,15,20,30,60},
fall={1,3,5,7,10,15,20,30,60},
next={0,1,2,3,4,5,6},
hold={true,false},
sequence={1,2,3},
visible={1,2,3},
target={10,20,40,100,200,500,1000},
freshLimit={0,5,15,1e99},
opponent={0,60,30,20,15,10,7,5,4,3,2,1},
}
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","insLeft","insRight","insDown"}
actName_show={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip","Hard Drop:","Soft Drop:","Hold:","Restart:","Instant Left:","Instant Right:","Ins Down:"}
blockPos={4,4,4,4,4,5,4} blockPos={4,4,4,4,4,5,4}
renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else
renName={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",} renName={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",}
@@ -98,9 +197,11 @@ ren_n={"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","
percent0to5={[0]="0%","20%","40%","60%","80%","100%",} percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0}
death_lock={10,9,8,7,6} death_lock={10,9,9,8,8}
death_wait={6,5,4,3,2} death_wait={6,6,5,5,4}
death_fall={10,8,7,6,5} death_fall={10,9,8,7,6}
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}
snapLevelValue={1,10,20,40,60,80}
act={ act={
moveLeft=function(auto) moveLeft=function(auto)
@@ -135,7 +236,10 @@ act={
end end
end, end,
softDrop=function() softDrop=function()
if cy~=y_img then P.cy=cy-1 end if cy~=y_img then
P.cy=cy-1
P.spinLast=false
end
P.downing=1 P.downing=1
end, end,
rotRight=function()spin(1)end, rotRight=function()spin(1)end,
@@ -147,11 +251,35 @@ act={
resetGameData() resetGameData()
count=60+26--Althour'z neim count=60+26--Althour'z neim
end, end,
down1=function()if cy~=y_img then P.cy=cy-1 end end, insDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end,
down4=function()for i=1,4 do if cy~=y_img then P.cy=cy-1 else break end end end, insLeft=function()
toDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end, while not ifoverlap(cb,cx-1,cy)do
toLeft=function()while not ifoverlap(cb,cx-1,cy)do P.cx,P.lockDelay=cx-1,gameEnv.lock;freshgho()end end, P.cx,P.lockDelay=cx-1,gameEnv.lock
toRight=function()while not ifoverlap(cb,cx+1,cy)do P.cx,P.lockDelay=cx+1,gameEnv.lock;freshgho()end end, freshgho()
end
end,
insRight=function()
while not ifoverlap(cb,cx+1,cy)do
P.cx,P.lockDelay=cx+1,gameEnv.lock
freshgho()
end
end,
down1=function()
if cy~=y_img then
P.cy=cy-1
P.spinLast=false
end
end,
down4=function()
for i=1,4 do
if cy~=y_img then
P.cy=cy-1
P.spinLast=false
else
break
end
end
end,
quit=function()Event.gameover.lose()end, quit=function()Event.gameover.lose()end,
--System movements --System movements
} }
@@ -177,38 +305,38 @@ TRS={
[1]={ [1]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [12]={{0,0},{1,0},{1,-1},{-1,0},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}}, [02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}},
[20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}}, [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}},
[13]={{0,0},{0,1},{0,-1},{-1,0},{1,0},{0,2}}, [13]={{0,0},{0,-1},{0,1},{-1,0}},
[31]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}}, [31]={{0,0},{0,1},{0,-1},{1,0}},
}, },--Z/J
[2]={ [2]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [32]={{0,0},{-1,0},{-1,-1},{1,0},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}}, [13]={{0,0},{0,1},{0,-1},{1,0}},
[31]={{0,0},{0,1},{0,-1},{-1,0},{1,0},{0,2}}, [31]={{0,0},{0,-1},{0,1},{-1,0}},
}, },--S/L
[5]={ [5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1},{0,1}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [12]={{0,0},{1,0},{1,-1},{0,-1},{-1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [21]={{0,0},{-1,0},{-1,1},{1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{-1,1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [32]={{0,0},{-1,0},{-1,-1},{0,-1},{1,-1},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
@@ -217,14 +345,14 @@ TRS={
[31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, [31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}},
}, },
[7]={ [7]={
[01]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}}, [01]={{0,0},{1,0},{-2,0},{-2,-1},{1,2}},
[10]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}}, [10]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}},
[12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, [12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[21]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}}, [21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}},
[23]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}}, [23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}},
[32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}}, [32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}},
[30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}}, [30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[03]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, [03]={{0,0},{-1,0},{2,0},{2,-1},{-1,2}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}}, [13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
@@ -240,22 +368,42 @@ Buttons={
{x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3}, {x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3},
{x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4}, {x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4},
{x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3}, {x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3},
{x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end,up=3}, {x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=back,up=3},
}, },
mode={ mode={
{x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel>1 then modeSel=modeSel-1 end end}, {x=1000,y=210,w=200,h=140,rgb=color.white,t="Λ",f=64,code=function()if modeSel>1 then modeSel=modeSel-1 end end},
{x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end}, {x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end},
{x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",hide=function()return not setting.virtualkeySwitch end,code=function()startGame(modeID[modeSel])end}, {x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",code=function()startGame(modeID[modeSel])end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, {x=400,y=150,w=180,h=80,rgb=color.yellow,t="Custom(c)",code=function()gotoScene("custom")end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
},
custom={
{x=1000,y=200,w=100,h=100,rgb=color.white,t="Λ",f=40,code=function()optSel=(optSel-2)%#customID+1 end},
{x=1000,y=440,w=100,h=100,rgb=color.white,t="v",f=50,code=function()optSel=optSel%#customID+1 end},
{x=880,y=320,w=100,h=100,rgb=color.white,t="<",f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
{x=1120,y=320,w=100,h=100,rgb=color.white,t=">",f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
{x=1000,y=580,w=180,h=80,rgb=color.green,t="Start",code=function()startGame("custom")end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
play={ play={
}, },
setting={--Normal setting setting={--Normal setting
{x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end,down=6,right=2}, {x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end,down=3,right=2},
{x=540,y=100,w=200,h=60,rgb=color.white,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end,down=6,left=1,right=3}, {x=540,y=100,w=200,h=60,rgb=color.white,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end,down=5,left=1,right=11},
{x=870,y=100,w=340,h=60,rgb=color.white,t=function()return setting.sfx and"Disable SFX"or"Enable SFX"end,code=function()setting.sfx=not setting.sfx end,down=4,left=2}, --1,2
{x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.bgm and"Disable BGM"or"Enable BGM"end,code=function()BGM()setting.bgm=not setting.bgm;BGM("blank")end,up=3,down=5,left=2}, {x=245,y=180,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,up=1,down=7,right=4},
{x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end, {x=410,y=180,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,up=1,down=8,left=3,right=5},
{x=460,y=180,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,up=2,down=9,left=4,right=6},
{x=625,y=180,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,up=2,down=10,left=5,right=13},
--3~6
{x=245,y=260,w=40,h=40,rgb=color.white,t="-",code=function()setting.sddas=(setting.sddas-1)%11 end,up=3,down=17,right=8},
{x=410,y=260,w=40,h=40,rgb=color.white,t="+",code=function()setting.sddas=(setting.sddas+1)%11 end,up=4,down=17,left=7,right=9},
{x=460,y=260,w=40,h=40,rgb=color.white,t="-",code=function()setting.sdarr=(setting.sdarr-1)%6 end,up=5,down=17,left=8,right=10},
{x=625,y=260,w=40,h=40,rgb=color.white,t="+",code=function()setting.sdarr=(setting.sdarr+1)%4 end,up=6,down=17,left=9,right=14},
--7~10
{x=870-90,y=100,w=160,h=60,rgb=color.white,t=function()return setting.sfx and"SFX:on"or"SFX:off"end,code=function()setting.sfx=not setting.sfx end,down=13,left=2,right=12},
{x=870+90,y=100,w=160,h=60,rgb=color.white,t=function()return setting.bgm and"BGM:on"or"BGM:off"end,code=function()BGM()setting.bgm=not setting.bgm;BGM("blank")end,down=13,left=11},
{x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end,
code=function() code=function()
setting.fullscreen=not setting.fullscreen setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
@@ -263,79 +411,58 @@ Buttons={
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
end end
end, end,
up=4,down=7,left=6 up=11,down=14,left=6
}, },
{x=435,y=220,w=320,h=60,rgb=color.green,t="Advanced settings",code=function()gotoScene("setting2")end,up=1,down=7,right=5}, {x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.bgblock and"BG animation:on"or"BG animation:off"end,
{x=435,y=300,w=320,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=6,down=8,right=5}, code=function()
{x=640,y=590,w=210,h=60,rgb=color.white,t="Save&Back",code=function()saveSetting()back()end,up=6}, setting.bgblock=not setting.bgblock
}, if not setting.bgblock then
setting2={--Advanced setting for i=1,16 do
{x=290,y=70 ,w=160,h=45,rgb=color.white,t=function()return setting.key[1]end,code=function()keysetting,gamepadsetting=1 end,up=1,down=2,right=10}, BGblockList[i].v=3*BGblockList[i].v
{x=290,y=130,w=160,h=45,rgb=color.white,t=function()return setting.key[2]end,code=function()keysetting,gamepadsetting=2 end,up=1,down=3,right=11}, end
{x=290,y=190,w=160,h=45,rgb=color.white,t=function()return setting.key[3]end,code=function()keysetting,gamepadsetting=3 end,up=2,down=4,right=12}, end
{x=290,y=250,w=160,h=45,rgb=color.white,t=function()return setting.key[4]end,code=function()keysetting,gamepadsetting=4 end,up=3,down=5,right=13}, end,
{x=290,y=310,w=160,h=45,rgb=color.white,t=function()return setting.key[5]end,code=function()keysetting,gamepadsetting=5 end,up=4,down=6,right=14}, up=12,down=15,left=10
{x=290,y=370,w=160,h=45,rgb=color.white,t=function()return setting.key[6]end,code=function()keysetting,gamepadsetting=6 end,up=5,down=7,right=15}, },
{x=290,y=430,w=160,h=45,rgb=color.white,t=function()return setting.key[7]end,code=function()keysetting,gamepadsetting=7 end,up=6,down=8,right=16},
{x=290,y=490,w=160,h=45,rgb=color.white,t=function()return setting.key[8]end,code=function()keysetting,gamepadsetting=8 end,up=7,down=9,right=17}, --11~14
{x=290,y=550,w=160,h=45,rgb=color.white,t=function()return setting.key[9]end,code=function()keysetting,gamepadsetting=9 end,up=8,down=28,right=18}, {x=870,y=340,w=340,h=60,rgb=color.white,t=function()return"frameDraw:"..setting.frameMul.."%"end,code=function()
--1~9
{x=540,y=70 ,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[1]end,code=function()gamepadsetting,keysetting=1 end,up=10,down=11,left=1,right=19},
{x=540,y=130,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[2]end,code=function()gamepadsetting,keysetting=2 end,up=10,down=12,left=2,right=23},
{x=540,y=190,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[3]end,code=function()gamepadsetting,keysetting=3 end,up=11,down=13,left=3,right=27},
{x=540,y=250,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[4]end,code=function()gamepadsetting,keysetting=4 end,up=12,down=14,left=4,right=27},
{x=540,y=310,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[5]end,code=function()gamepadsetting,keysetting=5 end,up=13,down=15,left=5,right=27},
{x=540,y=370,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[6]end,code=function()gamepadsetting,keysetting=6 end,up=14,down=16,left=6,right=29},
{x=540,y=430,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[7]end,code=function()gamepadsetting,keysetting=7 end,up=15,down=17,left=7,right=29},
{x=540,y=490,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[8]end,code=function()gamepadsetting,keysetting=8 end,up=16,down=18,left=8,right=29},
{x=540,y=550,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[9]end,code=function()gamepadsetting,keysetting=9 end,up=17,down=28,left=9,right=29},
--10~18
{x=745,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,left=10,right=20,down=23},
{x=910,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,left=19,right=21,down=24},
{x=960,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,left=20,right=22,down=25},
{x=1125,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,left=21,down=26},
--19~22
{x=745,y=150,w=40,h=40,rgb=color.white,t="-",code=function()setting.sddas=(setting.sddas-1)%11 end,up=19,down=27,left=10,right=24},
{x=910,y=150,w=40,h=40,rgb=color.white,t="+",code=function()setting.sddas=(setting.sddas+1)%11 end,up=20,down=27,left=23,right=25},
{x=960,y=150,w=40,h=40,rgb=color.white,t="-",code=function()setting.sdarr=(setting.sdarr-1)%6 end,up=21,down=27,left=24,right=26},
{x=1125,y=150,w=40,h=40,rgb=color.white,t="+",code=function()setting.sdarr=(setting.sdarr+1)%4 end,up=22,down=27,left=25},
--23~26
{x=935,y=220,w=320,h=65,rgb=color.white,t=function()return "frameDraw:"..setting.frameMul.."%"end,code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10) setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end if setting.frameMul>100 then setting.frameMul=25 end
end,up=24,down=29,left=11}, end,up=14,down=16},
{x=405,y=630,w=130,h=60,rgb=color.white,t="Reset",code=function()for i=1,#setting.key do setting.key[i]=gameEnv0.key[i] end end,up=9,right=29}, {x=870,y=420,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=15,down=17},
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,up=24,left=28}, {x=870,y=500,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=16,down=18},
--27~29 {x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=back,up=17},
--15~18
},
setting2={--Control setting
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
setting3={--Touch setting setting3={--Touch setting
{x=640,y=210,w=400,h=80,rgb=color.white,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function() {x=640,y=410,w=170,h=80,t="Back",code=back},
{x=640,y=210,w=500,h=80,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch setting.virtualkeySwitch=not setting.virtualkeySwitch
end}, end},
{x=500,y=310,w=120,h=80,rgb=color.white,t="Reset",code=function() {x=450,y=310,w=170,h=80,t="Reset",code=function()
for K=1,#virtualkey do for K=1,#virtualkey do
local b,b0=virtualkey[K],gameEnv0.virtualkey[K] local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4] b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey end--Reset virtualkey
end}, end},
{x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function() {x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function()
for K=1,#virtualkey do snapLevel=snapLevel%6+1
local b=virtualkey[K]
b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40
end--Snap all keys
end}, end},
{x=780,y=310,w=120,h=80,rgb=color.white,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function() {x=830,y=310,w=170,h=80,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6 setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha --Adjust virtualkey alpha
end}, end},
{x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function() {x=450,y=410,w=170,h=80,t="Icon",code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon --Switch virtualkey icon
end}, end},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end}, {x=830,y=410,w=170,h=80,t="Size",code=function()
{x=780,y=410,w=120,h=80,rgb=color.white,t="Size",code=function() if sel then
for K=1,#virtualkey do local b=virtualkey[sel]
local b=virtualkey[K]
b[4]=b[4]+10 b[4]=b[4]+10
if b[4]==150 then b[4]=40 end if b[4]==150 then b[4]=40 end
b[3]=b[4]^2 b[3]=b[4]^2
@@ -343,10 +470,11 @@ Buttons={
end}, end},
}, },
help={ help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back,right=2},
{x=980,y=590,w=230,h=60,rgb=color.white,t="Author's qq",code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left=1},
}, },
stat={ stat={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
sel=nil,--selected button id(integer) sel=nil,--selected button id(integer)
} }
@@ -355,6 +483,7 @@ for k,v in pairs(Buttons)do
v[i].alpha=0 v[i].alpha=0
end end
end end
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
@@ -388,7 +517,7 @@ Text={
}, },
help={ help={
"I think you don't need \"help\".", "I think you don't need \"help\".",
"THIS IS NOT TETRIS,and SRS NOT USED.", "THIS IS ONLY A SMALL BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3", "But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE", "Game is not public now,so DO NOT DISTIRBUTE",
"", "",

356
main.lua
View File

@@ -1,22 +1,23 @@
gc,kb,ms,tc,tm,fs,wd=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window gc,kb,ms,tc,tm,fs,wd,sys=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window,love.system
toN,toS=tonumber,tostring toN,toS=tonumber,tostring
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 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 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 ins,rem,sort=table.insert,table.remove,table.sort
null=function()end
ww,wh=gc.getWidth(),gc.getHeight() ww,wh=gc.getWidth(),gc.getHeight()
Timer=tm.getTime--Easy&Quick to get time! Timer=tm.getTime--Easy&Quick to get time!
mx,my,mouseShow=-20,-20,false mx,my,mouseShow=-20,-20,false
focus=true focus=true
system=love.system.getOS() system=sys.getOS()
touching=nil--1st touching ID touching=nil--1st touching ID
scene="" scene=""
gamemode="" gamemode=""
bgmPlaying=nil bgmPlaying=nil
curBG="none" curBG="none"
BGblock={ct=140} BGblock={ct=140,next=7}
kb.setKeyRepeat(false) kb.setKeyRepeat(false)
kb.setTextInput(false) kb.setTextInput(false)
@@ -28,7 +29,7 @@ function setFont(s)
if Fonts[s]then if Fonts[s]then
gc.setFont(Fonts[s]) gc.setFont(Fonts[s])
else else
local t=gc.setNewFont("cb.ttf",s) local t=gc.setNewFont("siyuanhei.otf",s-5)
Fonts[s]=t Fonts[s]=t
gc.setFont(t) gc.setFont(t)
end end
@@ -36,40 +37,16 @@ function setFont(s)
end end
end end
sfx={
"button",
"ready","start",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"drop","fall",
"reach",
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11",
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
"perfectclear",
}
bgm={
"blank",
"way",
"race",
"push",
"reason",
}
--System data
gameEnv0={ gameEnv0={
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ghost=true,center=true, ghost=true,center=true,
drop=30,lock=45, drop=30,lock=45,
wait=0,fall=20, wait=1,fall=1,
next=6,hold=true, next=6,hold=true,
sequence=1,visible=1, sequence=1,visible=1,
_20G=false,target=9e99, _20G=false,target=1e99,
freshLimit=9e99, freshLimit=1e99,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"},
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","leftshoulder","LEFT","RIGHT","DOWN"},
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
@@ -81,45 +58,54 @@ gameEnv0={
{1280-80,720-400,6400,80},--hold {1280-80,720-400,6400,80},--hold
{80,80,6400,80},--restart {80,80,6400,80},--restart
}, },
reach=function()end, reach=null,
--these three is actually no use,only provide a key --not all is actually used,some only provide a key
}
customSel={
drop=20,
lock=20,
wait=1,
fall=1,
next=7,
hold=1,
sequence=1,
visible=1,
target=4,
freshLimit=3,
opponent=1,
} }
randomMethod={ randomMethod={
function() function()
P.bn,P.cb=rem(nxt,1),rem(nb,1) P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #nxt<6 then if #P.nxt<6 then
local bag={1,2,3,4,5,6,7} local bag={1,2,3,4,5,6,7}
for i=1,7 do for i=1,7 do
ins(nxt,rem(bag,rnd(8-i))) ins(P.nxt,rem(bag,rnd(8-i)))
end end
end end
for i=6,#nxt do for i=6,#P.nxt do
nb[i]=blocks[nxt[i]][0] P.nb[i]=blocks[P.nxt[i]][0]
end end
end, end,
function() function()
P.bn,P.cb=rem(nxt,1),rem(nb,1) P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
for j=1,4 do local i,j=nil,0
local i,f=rnd(7) ::r::
for k=1,4 do i,j=rnd(7),j+1
if i==his[k]then f=true end if(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])and j<6 then goto r end
end
if not f then break end
end
P.nxt[6],P.nb[6]=i,blocks[i][0] P.nxt[6],P.nb[6]=i,blocks[i][0]
rem(his,1)ins(his,i) rem(P.his,1)ins(P.his,i)
end, end,
function() function()
P.bn,P.cb=rem(nxt,1),rem(nb,1) P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
repeat i=rnd(7)until i~=nxt[5] repeat i=rnd(7)until i~=P.nxt[5]
P.nxt[6],P.nb[6]=i,blocks[i][0] P.nxt[6],P.nb[6]=i,blocks[i][0]
end, end,
} }
loadmode={ loadmode={
sprint=function() sprint=function()
modeEnv={ modeEnv={
wait=1, drop=60,
fall=1,
target=40, target=40,
reach=Event.gameover.win, reach=Event.gameover.win,
} }
@@ -131,14 +117,21 @@ loadmode={
modeEnv={ modeEnv={
drop=1e99, drop=1e99,
lock=1e99, lock=1e99,
wait=1,
fall=1,
target=200, target=200,
reach=Event.gameover.win, reach=Event.gameover.win,
} }
createPlayer(1,340,15) createPlayer(1,340,15)
curBG="strap" curBG="strap"
BGM("reason") BGM("infinite")
end,
infinite=function()
modeEnv={
drop=1e99,
lock=1e99,
}
createPlayer(1,340,15)
curBG="glow"
BGM("infinite")
end, end,
gmroll=function() gmroll=function()
modeEnv={ modeEnv={
@@ -158,7 +151,6 @@ loadmode={
marathon=function() marathon=function()
modeEnv={ modeEnv={
drop=60, drop=60,
wait=1,
fall=20, fall=20,
target=10, target=10,
reach=Event.marathon_reach, reach=Event.marathon_reach,
@@ -184,23 +176,39 @@ loadmode={
curBG="game2" curBG="game2"
BGM("push") BGM("push")
end, end,
tetris41=function() puzzle=function()
modeEnv={ modeEnv={
wait=1, hold=false,
fall=1, das=0,
arr=0,
_20G=true,
drop=0,
lock=1e99,
fall=10,
target=40,
reach=Event.gameover.win,
} }
createPlayer(1,340,15)
curBG="glow"
BGM("way")
end,
techmino41=function()
modeEnv={
freshLimit=15,
}
royaleMode=true
createPlayer(1,340,15)--Player createPlayer(1,340,15)--Player
local n=2 local n=2
for i=1,4 do for i=1,4 do
for j=1,5 do for j=1,5 do
createPlayer(n,75*i-48,142*j-130,.19,rnd(10)) createPlayer(n,75*i-48,142*j-130,.19,1+rnd(14))
n=n+1 n=n+1
end end
end end
for i=9,12 do for i=9,12 do
for j=1,5 do for j=1,5 do
createPlayer(n,75*i+292,142*j-130,.19,rnd(10)) createPlayer(n,75*i+292,142*j-130,.19,1+rnd(14))
n=n+1 n=n+1
end end
end--AIs end--AIs
@@ -210,8 +218,6 @@ loadmode={
end, end,
solo=function() solo=function()
modeEnv={ modeEnv={
wait=1,
fall=1,
freshLimit=15, freshLimit=15,
} }
createPlayer(1,20,15)--Player createPlayer(1,20,15)--Player
@@ -224,8 +230,6 @@ loadmode={
modeEnv={ modeEnv={
drop=15, drop=15,
lock=30, lock=30,
wait=1,
fall=1,
visible=0, visible=0,
freshLimit=10, freshLimit=10,
} }
@@ -236,8 +240,6 @@ loadmode={
end, end,
asymsolo=function() asymsolo=function()
modeEnv={ modeEnv={
wait=1,
fall=1,
visible=2, visible=2,
freshLimit=15, freshLimit=15,
} }
@@ -247,6 +249,56 @@ loadmode={
curBG="game2" curBG="game2"
BGM("race") BGM("race")
end, end,
p2=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,15)
createPlayer(2,650,15)
curBG="game2"
BGM("way")
end,
p3=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,100,.65)
createPlayer(2,435,100,.65)
createPlayer(3,850,100,.65)
curBG="game2"
BGM("way")
end,
p4=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,25,150,.5)
createPlayer(2,335,150,.5)
createPlayer(3,645,150,.5)
createPlayer(4,955,150,.5)
curBG="game2"
BGM("way")
end,
custom=function()
modeEnv={reach=Event.gameover.win}
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
curBG="matrix"
BGM("reason")
end,
} }
Event={ Event={
gameover={ gameover={
@@ -255,21 +307,36 @@ Event={
P.control=false P.control=false
P.timing=false P.timing=false
P.waiting=1e99 P.waiting=1e99
P.control=false P.result="WIN"
gameover=0
P.b2b=0 P.b2b=0
for i=1,#field do
for j=1,10 do
visTime[i][j]=min(visTime[i][j],20)
end
end
showText("WIN","appear",100,nil,true)
if P.id==1 and players[2]and players[2].ai then SFX("win")end
ins(task,Event.task.win) ins(task,Event.task.win)
end, end,
lose=function() lose=function()
P.alive=false P.alive=false
P.control=false P.control=false
P.timing=false P.timing=false
P.result=" K.O."
P.waiting=1e99 P.waiting=1e99
P.b2b=0 P.b2b=0
gameover=0 showText("LOSE","appear",100,nil,true)
if royaleMode and P.lastRecv then
throwBadge(P.id,P.lastRecv,P.badge)
players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1
players[P.lastRecv].strength=min(int(players[P.lastRecv].badge*.2),4)
end
for i=1,#players.alive do for i=1,#players.alive do
if players.alive[i]==P.id then if players.alive[i]==P.id then
rem(players.alive,i) rem(players.alive,i)
if #players.alive==1 then
ins(players[players.alive[1]].task,Event.task.winTrigger)
end
break break
end end
end end
@@ -277,6 +344,12 @@ Event={
P.atkBuffer[i].sent=true P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0 P.atkBuffer[i].time=0
end end
for i=1,#field do
for j=1,10 do
visTime[i][j]=min(visTime[i][j],20)
end
end
if P.id==1 and players[2]and players[2].ai then SFX("fail")end
ins(task,Event.task.lose) ins(task,Event.task.lose)
end, end,
}, },
@@ -304,30 +377,44 @@ Event={
end end
end, end,
task={ task={
winTrigger=function()
Event.gameover.win()
return true
end,
win=function() win=function()
gameover=gameover+1 P.counter=P.counter+1
if gameover%3==0 then if P.counter>60 then
local j=gameover/3 for i=1,#field do
if j<=#field then for j=1,10 do
for i=1,10 do if visTime[i][j]>0 then
if field[j][i]>0 then field[j][i]=13 end visTime[i][j]=visTime[i][j]-1
end
end end
if j==#field then gameover=50 end
end end
end if P.counter==100 then
if gameover>80 then for i=1,#field do
return true removeRow(field)
removeRow(visTime)
end
return true
end
end end
end, end,
lose=function() lose=function()
gameover=gameover+1 P.counter=P.counter+1
if gameover%3==0 then if P.counter>60 then
local j=gameover/3 for i=1,#P.field do
if field[j]then for j=1,10 do
for i=1,10 do if P.visTime[i][j]>0 then
if field[j][i]>0 then field[j][i]=13 end P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.counter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end end
else
return true return true
end end
end end
@@ -344,61 +431,105 @@ mesDisp={
setFont(75) setFont(75)
mStr(max(200-P.cstat.row,0),-75,280) mStr(max(200-P.cstat.row,0),-75,280)
end, end,
infinite=function()
setFont(50)
mStr(cstat.atk,-75,320)
mStr(format("%.2f",2.5*cstat.atk/cstat.piece),-75,430)
setFont(20)
gc.print("Attack",-100,360)
gc.print("Efficiency",-108,472)
end,
gmroll=function() gmroll=function()
setFont(35) setFont(30)
gc.print("Tetris",-120,390) gc.print("Techrash",-130,390)
setFont(80) setFont(80)
mStr(cstat.tetris,-75,420) mStr(cstat.techrash,-75,420)
end, end,
marathon=function() marathon=function()
setFont(50) setFont(50)
mStr(P.cstat.row,-75,330) mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380) mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377) gc.rectangle("fill",-120,376,90,4)
end, end,
death=function() death=function()
setFont(50) setFont(50)
mStr(P.cstat.row,-75,330) mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380) mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377) gc.rectangle("fill",-120,376,90,4)
end, end,
tetris41=function() puzzle=function()
gc.print("Remain",-140,450) setFont(75)
gc.print("Attack",-130,305) mStr(max(40-P.cstat.row,0),-75,280)
setFont(80) end,
mStr(#players.alive,-75,380) techmino41=function()
mStr(cstat.atk,-75,240) gc.draw(badgeIcon,-120,150,nil,1.5)
setFont(50)
gc.print(badge,-65,150)
mStr(cstat.atk,-75,320)
mStr(#players.alive,-75,430)
setFont(20)
gc.print("Attack",-100,360)
gc.print("Remain",-105,472)
end, end,
blind=function() blind=function()
setFont(35) setFont(30)
gc.print("Rows",-115,220) gc.print("Rows",-110,220)
gc.print("Tetris",-120,390) gc.print("Techrash",-130,390)
setFont(80) setFont(80)
mStr(P.cstat.row,-75,250) mStr(P.cstat.row,-75,250)
mStr(cstat.tetris,-75,420) mStr(cstat.techrash,-75,420)
end, end,
solo=function() solo=function()
gc.print("Attack",-130,365) gc.print("Attack",-128,365)
setFont(80) setFont(80)
mStr(cstat.atk,-75,300) mStr(cstat.atk,-75,300)
end, end,
asymsolo=function() asymsolo=function()
gc.print("Attack",-132,365) gc.print("Attack",-128,365)
setFont(80) setFont(80)
mStr(cstat.atk,-75,300) mStr(cstat.atk,-75,300)
end, end,
custom=function()
if gameEnv.target<1e4 then
setFont(75)
mStr(max(gameEnv.target-P.cstat.row,0),-75,280)
end
end
} }
--Game system Data --Game system Data
setting={ setting={
sfx=true,bgm=true, sfx=true,bgm=true,
fullscreen=false, fullscreen=false,
bgblock=true,
lang="eng", lang="eng",
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ghost=true,center=true, ghost=true,center=true,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"}, keyMap={
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","RB","LB","LEFT","RIGHT","DOWN"}, {"left","right","x","z","c","up","down","space","r","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","leftshoulder","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
{"","","","","","","","","","","",""},
},--keyboard & joystick
keyLib={
{1},
{2},
{3},
{4},
},--Players' key setting(s)
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
@@ -428,21 +559,20 @@ stat={
spin=0, spin=0,
} }
--User Data&User Setting --User Data&User Setting
--------------------------------Warning!_G is __indexed to players[n] when changing any player's data! --------------------------------Wrning!_G __index Ply[n] when chng any playr's elments!
require("list")
require("texture")
require("BGblock")
require("ai")
require("toolfunc") require("toolfunc")
require("sysfunc") require("sysfunc")
require("gamefunc") require("gamefunc")
require("list")
require("texture")
require("ai")
require("timer") require("timer")
require("paint") require("paint")
require("game_scene") require("scene")
require("call&sys") require("call&sys")
userData=fs.newFile("userData") userData=fs.newFile("userdata")
userSetting=fs.newFile("userSetting") userSetting=fs.newFile("usersetting")
if fs.getInfo("userdata")then if fs.getInfo("userdata")then
loadData() loadData()
end end

281
paint.lua
View File

@@ -36,21 +36,22 @@ FX={
flash=0,--Black screen(frame) flash=0,--Black screen(frame)
shake=0,--Screen shake(frame) shake=0,--Screen shake(frame)
beam={},--Attack beam beam={},--Attack beam
badge={},--badge thrown
appear=function(t,a) appear=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a) gc.setColor(1,1,1,a)
mStr(t.text,150,250-t.font*.5+t.dy) mStr(t.text,150,250-t.font*.5+t.dy)
end, end,
fly=function(t,a) fly=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a) gc.setColor(1,1,1,a)
mStr(t.text,150+(t.t-15)^3*.005,250-t.font*.5+t.dy) mStr(t.text,150+(t.t-15)^3*.005,250-t.font*.5+t.dy)
end, end,
stretch=function(t,a) stretch=function(t,a)
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,250+t.dy) gc.translate(150,250+t.dy)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*a) gc.setColor(1,1,1,a)
if t.t<20 then gc.scale((20-t.t)*.015+1,1)end if t.t<20 then gc.scale((20-t.t)*.015+1,1)end
mStr(t.text,0,-t.font*.5) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
@@ -59,7 +60,7 @@ FX={
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,290+t.dy) gc.translate(150,290+t.dy)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*a) gc.setColor(1,1,1,a)
if t.t<20 then gc.shear((20-t.t)*.05,0)end if t.t<20 then gc.shear((20-t.t)*.05,0)end
mStr(t.text,0,-t.font*.5) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
@@ -68,7 +69,7 @@ FX={
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,250+t.dy) gc.translate(150,250+t.dy)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.1,1)*a) gc.setColor(1,1,1,a)
if t.t<20 then if t.t<20 then
gc.rotate((20-t.t)^2*.0015) gc.rotate((20-t.t)^2*.0015)
end end
@@ -77,9 +78,19 @@ FX={
end, end,
flicker=function(t,a) flicker=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a*(rnd()+.5)) gc.setColor(1,1,1,a*(rnd()+.5))
mStr(t.text,150,250-t.font*.5+t.dy) mStr(t.text,150,250-t.font*.5+t.dy)
end, end,
zoomout=function(t,a)
gc.push("transform")
setFont(t.font)
gc.translate(150,290+t.dy)
gc.setColor(1,1,1,a)
local k=t.t^.5*.2+1
gc.scale(k,k)
mStr(t.text,0,-t.font*.5)
gc.pop()
end
} }
function drawButton() function drawButton()
@@ -89,9 +100,10 @@ function drawButton()
local t=i==Buttons.sel and .3 or 0 local t=i==Buttons.sel and .3 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t 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 if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],B.alpha) 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.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],.3) 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)
local t=B.t local t=B.t
local y0 local y0
@@ -104,7 +116,7 @@ function drawButton()
mStr(t,B.x-1,y0+2) mStr(t,B.x-1,y0+2)
mStr(t,B.x+1,y0+2) mStr(t,B.x+1,y0+2)
end end
gc.setColor(B.rgb) gc.setColor(C)
if t then if t then
mStr(t,B.x,y0+1) mStr(t,B.x,y0+1)
end end
@@ -126,13 +138,22 @@ function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha) gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawVirtualkey() function drawVirtualkey(s)
gc.setLineWidth(10) gc.setLineWidth(10)
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2) if s then
for i=1,#virtualkey do for i=1,#virtualkey do
local b=virtualkey[i] gc.setColor(1,s==i and 0 or 1,s==i and 0 or 1,setting.virtualkeyAlpha*.2)
gc.circle("line",b[1],b[2],b[4]-5) local b=virtualkey[i]
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end gc.circle("line",b[1],b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end
end
else
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2)
for i=1,#virtualkey do
local b=virtualkey[i]
gc.circle("line",b[1],b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end
end
end end
end end
@@ -169,6 +190,15 @@ function Pnt.BG.strap()
gc.draw(background[2],x,0,nil,10) gc.draw(background[2],x,0,nil,10)
gc.draw(background[2],x-1280,0,nil,10) gc.draw(background[2],x-1280,0,nil,10)
end end
function Pnt.BG.matrix()
for i=0,15 do
for j=0,8 do
local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3
gc.setColor(t,t,t)
gc.rectangle("fill",80*i,80*j,80,80)
end
end
end
function Pnt.load() function Pnt.load()
gc.setLineWidth(4) gc.setLineWidth(4)
@@ -177,28 +207,18 @@ function Pnt.load()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",340,340,640,40) gc.rectangle("line",340,340,640,40)
setFont(30) setFont(30)
mStr(Text.load[loading],640,345) mStr(Text.load[loading],640,346)
setFont(20) setFont(20)
mStr("not animation,real loading!",640,392) mStr("not animation,real loading!",640,392)
end end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(30) setFont(30)
gc.print("Alpha V0.5",370,150) gc.print("Alpha V0.7.1",370,150)
gc.print(system,530,110) gc.print(system,530,110)
gc.draw(titleImage,30,30) gc.draw(titleImage,30,30)
end end
function Pnt.mode() function Pnt.mode()
if setting.virtualkeySwitch then
gc.setColor(.5,.5,.5)
gc.draw(charV,1019,249,pi)
gc.draw(charV,1021,249,pi)
gc.draw(charV,1019,251,pi)
gc.draw(charV,1020,251,pi)
gc.setColor(1,1,1)
gc.draw(charV,1020,250,pi)
end
gc.setColor(1,1,1)
setFont(30) setFont(30)
mStr(modeInfo[modeID[modeSel]],270,300) mStr(modeInfo[modeID[modeSel]],270,300)
setFont(80) setFont(80)
@@ -213,6 +233,25 @@ function Pnt.mode()
end end
end end
end end
function Pnt.custom()
setFont(80)
gc.setColor(color.lightGrey)
gc.print("Custom Game",20,20)
gc.setColor(color.white)
gc.print("Custom Game",22,23)
setFont(35)
for i=1,#customID do
local k=customID[i]
local y=90+35*i
gc.print(customOption[k],50,y)
if customVal[k]then
gc.print(customVal[k][customSel[k]],350,y)
else
gc.print(customRange[k][customSel[k]],350,y)
end
end
gc.print("",10,88+35*optSel)
end
function Pnt.play() function Pnt.play()
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
@@ -221,9 +260,8 @@ function Pnt.play()
gc.push("transform") gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setLineWidth(3) gc.setLineWidth(13)
gc.translate(10,15) gc.stencil(stencil_field_small, "replace",1)
gc.stencil(stencil_field, "replace", 1)
gc.translate(0,fieldBeneath) gc.translate(0,fieldBeneath)
gc.setStencilTest("equal",1) gc.setStencilTest("equal",1)
for j=1,#field do for j=1,#field do
@@ -233,77 +271,51 @@ function Pnt.play()
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05) drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05)
end end
end end
else
gc.setColor(1,1,1,falling/gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30)
end end
end--Field end--Field
if gameEnv.ghost then
for i=1,r do for j=1,c do
if cb[i][j]>0 then
drawPixel(i+y_img-1,j+cx-1,bn,.3)
end
end end
end--Ghost
if waiting<=0 then
gc.setColor(2,2,2)
for i=1,r do for j=1,c do
if cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1)
end
end end--Block
end
gc.setColor(1,1,1) 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.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath) gc.translate(0,-fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder gc.setColor(frameColor[P.strength])gc.rectangle("line",-7,-7,314,614)--Draw boarder
local h=0 if P.result then
for i=1,#atkBuffer do gc.setColor(1,1,1,min(P.counter,60)*.01)
local a=atkBuffer[i] setFont(100)
local bar=a.amount*30 mStr(P.result,150,250)
if not a.sent then else
if a.time<20 then local h=0
bar=bar*(20*a.time)^.5*.05 for i=1,#atkBuffer do
--Appear local a=atkBuffer[i]
local bar=a.amount*30
if not a.sent then
if a.countdown>0 then
gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",315,600-h,8,-bar+5)
gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",315,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing
else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",315,600-h,8,-bar+5)
--Warning
end
end end
if a.countdown>0 then h=h+bar
gc.setColor(attackColor[a.lv][1]) if h>600 then break end
gc.rectangle("fill",305,600-h,8,-bar+5) end--Buffer line
gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",305,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing
else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",305,600-h,8,-bar+5)
--Warning
end
else
gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05
gc.rectangle("fill",305,600-h,8,-bar+5)
--Disappear
end
h=h+bar
if h>600 then break end
end--Buffer line
gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue) gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-15,600,10,-b2b1) gc.rectangle("fill",-15,600,10,-b2b)
--B2B bar --B2B bar
end
for i=1,#bonus do
local a=#field>9-bonus[i].dy*.03333 and .6 or 1
bonus[i]:draw(a)
end--Effects
gc.pop() gc.pop()
else else
gc.push("transform") gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background
gc.setLineWidth(3) gc.setLineWidth(7)
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame
gc.translate(150,70) gc.translate(150,70)
gc.stencil(stencil_field, "replace", 1) gc.stencil(stencil_field, "replace", 1)
gc.translate(0,fieldBeneath) gc.translate(0,fieldBeneath)
@@ -350,7 +362,7 @@ function Pnt.play()
gc.draw(PTC.dust[p])--Draw game field gc.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask gc.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath) gc.translate(0,-fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder gc.setColor(1,1,1)gc.rectangle("line",-3,-13,306,616)--Draw boarder
local h=0 local h=0
for i=1,#atkBuffer do for i=1,#atkBuffer do
@@ -363,31 +375,31 @@ function Pnt.play()
end end
if a.countdown>0 then if a.countdown>0 then
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",305,600-h,8,-bar+5) gc.rectangle("fill",308,600-h,8,-bar+5)
gc.setColor(attackColor[a.lv][2]) gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",305,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) gc.rectangle("fill",308,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing --Timing
else else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",305,600-h,8,-bar+5) gc.rectangle("fill",308,600-h,8,-bar+5)
--Warning --Warning
end end
else else
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05 bar=bar*(20-a.time)*.05
gc.rectangle("fill",305,600-h,8,-bar+5) gc.rectangle("fill",308,600-h,8,-bar+5)
--Disappear --Disappear
end end
h=h+bar h=h+bar
if h>600 then break end if h>600 then break end
end--Buffer line end--Buffer line
gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue) gc.setColor(b2b<100 and color.white or b2b<=500 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-15,600,10,-b2b1) gc.rectangle("fill",-17,600,10,-b2b1)
gc.setColor(color.red) gc.setColor(color.red)
gc.rectangle("line",-20,600-100,15,2) gc.rectangle("fill",-23,600-100,16,5)
gc.setColor(color.blue) gc.setColor(color.blue)
gc.rectangle("line",-20,600-480,15,2) gc.rectangle("fill",-23,600-500,16,5)
--B2B bar --B2B bar
setFont(40) setFont(40)
@@ -423,13 +435,12 @@ function Pnt.play()
gc.pop() gc.pop()
end--Draw starting counter end--Draw starting counter
for i=1,#bonus do for i=1,#bonus do
local a=#field>(9-bonus[i].dy*.03333)and .7 or 1 bonus[i]:draw(min((30-abs(bonus[i].t-30))*.05,1)*(not bonus[i].solid and #field>(9-bonus[i].dy*.03333)and .7 or 1))
bonus[i]:draw(a)
end--Effects end--Effects
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(40) setFont(40)
gc.print(format("%0.2f",time),-125,530)--Draw time gc.print(format("%.2f",time),-130,530)--Draw time
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message
setFont(15) setFont(15)
@@ -447,36 +458,70 @@ function Pnt.play()
for i=1,3 do for i=1,3 do
gc.draw(PTC.attack[i]) gc.draw(PTC.attack[i])
end end
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
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)
end
setmetatable(_G,nil) setmetatable(_G,nil)
if setting.virtualkeySwitch then if setting.virtualkeySwitch then
drawVirtualkey() drawVirtualkey()
end end
end end
function Pnt.setting2() function Pnt.setting()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(18)
mStr("softdropDAS:"..setting.sddas,828,140)
mStr("softdropARR:"..setting.sdarr,1043,140)
setFont(35) setFont(35)
mStr("DAS:"..setting.das,828,73) mStr("DAS:"..setting.das,328,163)
mStr("ARR:"..setting.arr,1043,73) mStr("ARR:"..setting.arr,543,163)
gc.print("Keyboard Joystick",223,10) setFont(18)
for i=1,9 do mStr("softdropDAS:"..setting.sddas,328,250)
gc.printf(actName_show[i]..":",0,60*i-8,180,"right") mStr("softdropARR:"..setting.sdarr,543,250)
end
function Pnt.setting2()
if keyboardSetting then
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1)
else
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1)
end end
if keysetting or gamepadsetting then gc.rectangle("fill",240,40*keyboardSet-10,200,40)
gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10) if joystickSetting then
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1)
else
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1)
end end
gc.rectangle("fill",440,40*joystickSet-10,200,40)
gc.setColor(1,1,1)
setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,530)
setFont(25)
for y=1,12 do
mStr(actName_show[y],150,40*y)
for x=1,2 do
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y)
end
gc.line(40,40*y-10,640,40*y-10)
end
for x=1,4 do
gc.line(200*x-160,30,200*x-160,510)
end
gc.line(40,510,640,510)
gc.print("Keyboard | Joystick",330,3)
gc.print("Arrowkey to select/change slot,Enter to change,Esc back",50,580)
end end
function Pnt.setting3() function Pnt.setting3()
drawVirtualkey() drawVirtualkey(sel)
gc.setLineWidth(3) local d=snapLevelValue[snapLevel]
gc.setColor(1,1,1,sin(Timer()*4)*.1+.1) if d>=10 then
for i=1,31 do gc.setLineWidth(3)
gc.line(40*i,0,40*i,720) gc.setColor(1,1,1,sin(Timer()*4)*.1+.1)
end for i=1,1280/d-1 do
for i=1,17 do gc.line(d*i,0,d*i,720)
gc.line(0,40*i,1280,40*i) end
for i=1,720/d-1 do
gc.line(0,d*i,1280,d*i)
end
end end
end end
function Pnt.help() function Pnt.help()

View File

@@ -19,11 +19,16 @@ end
function game.mode() function game.mode()
saveData() saveData()
modeSel=modeSel or 1 modeSel=modeSel or 1
if players then restockRow()end--collectGarbage
scene="mode" scene="mode"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
end end
function game.custom()
optSel=optSel or 1
scene="custom"
curBG="matrix"
BGM("blank")
end
function game.play() function game.play()
scene="play" scene="play"
--curBG="game1" --curBG="game1"
@@ -35,17 +40,23 @@ function game.setting()
scene="setting" scene="setting"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
end--Normal setting end
function game.setting2() function game.setting2()
scene="setting2" scene="setting2"
curBG="none" curBG="none"
keyssetting=nil curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
BGM("blank") BGM("blank")
end--Advanced setting and keyboard&joystick setting end--Control settings
function game.setting3() function game.setting3()
scene="setting3" scene="setting3"
curBG="game1" curBG="game1"
sel=nil
keyssetting=nil keyssetting=nil
snapLevel=1
BGM("blank") BGM("blank")
end--Touch setting end--Touch setting
function game.help() function game.help()

BIN
siyuanhei.otf Normal file

Binary file not shown.

View File

@@ -13,7 +13,7 @@ function sysSFX(s,v)
end end
end end
function SFX(s,v) function SFX(s,v)
if setting.sfx then if setting.sfx and not P.ai then
local n=1 local n=1
while sfx[s][n]:isPlaying()do while sfx[s][n]:isPlaying()do
n=n+1 n=n+1
@@ -23,10 +23,6 @@ function SFX(s,v)
break break
end end
end end
if P.id>1 then
v=1/(#players.alive-1)
-- if v<.02 then return nil end
end
sfx[s][n]:setVolume(v or 1) sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play() sfx[s][n]:play()
end end
@@ -112,14 +108,31 @@ function loadSetting()
elseif t=="fullscreen"then elseif t=="fullscreen"then
setting.fullscreen=v=="true" setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
elseif t=="keyset"then elseif t=="bgblock"then
v=string.splitS(v) setting.bgblock=v=="true"
for i=#v+1,8 do v[i]="N/A"end elseif t=="keymap"then
setting.key=v v=string.splitS(v,"/")
elseif t=="gamepadset"then for i=1,16 do
v=string.splitS(v) local v1=string.splitS(v[i],",")
for i=#v+1,8 do v[i]="N/A"end for j=1,#v1 do
setting.gamepad=v setting.keyMap[i][j]=v1[j]
end
end
elseif t=="keylib"then
v=string.splitS(v,"/")
for i=1,4 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
for j=1,#setting.keyLib[i]do
local v=setting.keyLib[i][j]
if int(v)~=v or v>=9 or v<=0 then
setting.keyLib[i]={i}
break
end
end
end
elseif t=="virtualkey"then elseif t=="virtualkey"then
v=string.splitS(v,"/") v=string.splitS(v,"/")
for i=1,9 do for i=1,9 do
@@ -154,17 +167,25 @@ function saveSetting()
end--Saving a integer is better? end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",") vk[i]=table.concat(virtualkey[i],",")
end--pre-pack virtualkey setting end--pre-pack virtualkey setting
local map={}
for i=1,16 do
map[i]=table.concat(setting.keyMap[i],",")
end
local lib={}
for i=1,4 do
lib[i]=table.concat(setting.keyLib[i],",")
end
local t=table.concat({ local t=table.concat({
stringPack("sfx=",setting.sfx), stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm), stringPack("bgm=",setting.bgm),
stringPack("fullscreen=",setting.fullscreen), stringPack("fullscreen=",setting.fullscreen),
stringPack("bgblock=",setting.bgblock),
stringPack("das=",setting.das), stringPack("das=",setting.das),
stringPack("arr=",setting.arr), stringPack("arr=",setting.arr),
stringPack("sddas=",setting.sddas), stringPack("sddas=",setting.sddas),
stringPack("sdarr=",setting.sdarr), stringPack("sdarr=",setting.sdarr),
stringPack("keyset=",table.concat(setting.key,"/")), stringPack("keymap=",table.concat(map,"/")),
stringPack("gamepadset=",table.concat(setting.gamepad,"/")), stringPack("keylib=",table.concat(lib,"/")),
stringPack("virtualkey=",table.concat(vk,"/")), stringPack("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha), stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon), stringPack("virtualkeyIcon=",setting.virtualkeyIcon),

View File

@@ -1,15 +1,24 @@
setFont(80)
charV=gc.newText(Fonts[80],"v")
local N=gc.newImage local N=gc.newImage
function C(x,y)
c=gc.newCanvas(x,y)
gc.setCanvas(c)
end
titleImage=N("/image/mess/title.png") titleImage=N("/image/mess/title.png")
mouseIcon=N("/image/mess/mouseIcon.png") mouseIcon=N("/image/mess/mouseIcon.png")
spinCenter=N("/image/mess/spinCenter.png") spinCenter=N("/image/mess/spinCenter.png")
dialCircle=N("/image/mess/dialCircle.png") dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png") dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png")
blockSkin={} blockSkin={}
local img=N("/image/block/1.png")
for i=1,13 do for i=1,13 do
blockSkin[i]=N("/image/block/1/"..i..".png") C(30,30)
gc.draw(img,30-30*i,0)
blockSkin[i]=c
end end
img:release()
background={} background={}
gc.setColor(1,1,1) gc.setColor(1,1,1)
background={ background={
@@ -23,7 +32,7 @@ end
PTC={dust={}}--Particle systems PTC={dust={}}--Particle systems
c=gc.newCanvas(6,6)gc.setCanvas(c) C(6,6)
gc.clear(1,1,1) gc.clear(1,1,1)
PTC.dust[0]=gc.newParticleSystem(c,1000) PTC.dust[0]=gc.newParticleSystem(c,1000)
PTC.dust[0]:setParticleLifetime(.2,.3) PTC.dust[0]:setParticleLifetime(.2,.3)
@@ -34,19 +43,19 @@ c:release()
--Dust particles --Dust particles
PTC.attack={} PTC.attack={}
PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/attack/1.png"),200) PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/mess/atk1.png"),200)
PTC.attack[1]:setParticleLifetime(.25) PTC.attack[1]:setParticleLifetime(.25)
PTC.attack[1]:setEmissionRate(0) PTC.attack[1]:setEmissionRate(0)
PTC.attack[1]:setSpin(10) PTC.attack[1]:setSpin(10)
PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0) PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/attack/2.png"),200) PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/mess/atk2.png"),200)
PTC.attack[2]:setParticleLifetime(.3) PTC.attack[2]:setParticleLifetime(.3)
PTC.attack[2]:setEmissionRate(0) PTC.attack[2]:setEmissionRate(0)
PTC.attack[2]:setSpin(8) PTC.attack[2]:setSpin(8)
PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0) PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/attack/3.png"),200) PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/mess/atk3.png"),200)
PTC.attack[3]:setParticleLifetime(.4) PTC.attack[3]:setParticleLifetime(.4)
PTC.attack[3]:setEmissionRate(0) PTC.attack[3]:setEmissionRate(0)
PTC.attack[3]:setSpin(6) PTC.attack[3]:setSpin(6)

View File

@@ -53,6 +53,13 @@ function Tmr.play(dt)
rem(FX.beam,i) rem(FX.beam,i)
end end
end end
for i=#FX.badge,1,-1 do
local b=FX.badge[i]
b.t=b.t+1
if b.t==60 then
rem(FX.badge,i)
end
end
for i=1,3 do for i=1,3 do
PTC.attack[i]:update(dt) PTC.attack[i]:update(dt)
end end
@@ -99,7 +106,7 @@ function Tmr.play(dt)
v=0 for i=2,10 do v=v+i*(i-1)*7.2/(frame-dropTime[i])end P.dropSpeed=dropSpeed*.99+v*.1 v=0 for i=2,10 do v=v+i*(i-1)*7.2/(frame-dropTime[i])end P.dropSpeed=dropSpeed*.99+v*.1
--Update speeds --Update speeds
if P.ai then if P.ai and waiting<=0 then
P.ai.controlDelay=P.ai.controlDelay-1 P.ai.controlDelay=P.ai.controlDelay-1
if P.ai.controlDelay==0 then if P.ai.controlDelay==0 then
if #P.ai.controls>0 then if #P.ai.controls>0 then
@@ -127,7 +134,7 @@ function Tmr.play(dt)
act[moving>0 and"moveRight"or"moveLeft"](true) act[moving>0 and"moveRight"or"moveLeft"](true)
end end
else else
act[moving>0 and"toRight"or"toLeft"]() act[moving>0 and"insRight"or"insLeft"]()
end end
end end
else else
@@ -142,7 +149,7 @@ function Tmr.play(dt)
act.down1() act.down1()
end end
else else
act.toDown() act.insDown()
end end
end end
else else
@@ -156,7 +163,9 @@ function Tmr.play(dt)
removeRow(field,clearing[i]) removeRow(field,clearing[i])
removeRow(visTime,clearing[i]) removeRow(visTime,clearing[i])
end end
P.clearing={} while #clearing>0 do
rem(clearing)
end
end end
--Rows cleared drop --Rows cleared drop
elseif waiting>0 then elseif waiting>0 then
@@ -166,7 +175,7 @@ function Tmr.play(dt)
end end
else else
if cy~=y_img then if cy~=y_img then
if dropDelay>1 then if dropDelay>0 then
P.dropDelay=dropDelay-1 P.dropDelay=dropDelay-1
else else
drop() drop()
@@ -181,8 +190,12 @@ function Tmr.play(dt)
end end
end end
end end
if P.b2b>480 then P.b2b=P.b2b-1 end P.b2b1=P.b2b1*.93+P.b2b*.07
else--Alive if P.b2b>500 then
P.b2b=P.b2b-.06
end
--Alive
else
P.keySpeed=keySpeed*.96+cstat.key/time*60*.04 P.keySpeed=keySpeed*.96+cstat.key/time*60*.04
P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04 P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04
--Final average speeds --Final average speeds
@@ -197,13 +210,23 @@ function Tmr.play(dt)
P.clearing={} P.clearing={}
end end
end--Rows cleared drop end--Rows cleared drop
for j=1,#field do for i=1,10 do if P.counter<40 then
if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end for j=1,#field do for i=1,10 do
end end--Make field visible if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end
end--Dead end end--Make field visible
end
if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end
--Dead
end
for i=#bonus,1,-1 do for i=#bonus,1,-1 do
bonus[i].t=bonus[i].t+1 if bonus[i].inf then
if bonus[i].t>60 then rem(bonus,i)end if bonus[i].t<30 then
bonus[i].t=bonus[i].t+1
end
else
bonus[i].t=bonus[i].t+1
if bonus[i].t==60 then rem(bonus,i)end
end
end end
for i=#task,1,-1 do for i=#task,1,-1 do
if task[i]()then rem(task,i)end if task[i]()then rem(task,i)end
@@ -222,7 +245,6 @@ function Tmr.play(dt)
end end
end end
if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-3 end if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-3 end
P.b2b1=P.b2b1*.96
PTC.dust[p]:update(dt) PTC.dust[p]:update(dt)
end end
setmetatable(_G,nil) setmetatable(_G,nil)

View File

@@ -1,5 +1,4 @@
function string.splitS(s,sep) function string.splitS(s,sep)
sep=sep or"/"
local t={} local t={}
repeat repeat
local i=find(s,sep)or #s+1 local i=find(s,sep)or #s+1
@@ -39,14 +38,20 @@ end
function removeRow(t,k) function removeRow(t,k)
ins(freeRow,rem(t,k)) ins(freeRow,rem(t,k))
end end
function restockRow()
for p=1,#players do local count=0
local f,f2=players[p].field,players[p].visTime BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
while #f>0 do function getNewBlock()
removeRow(f,1) count=count+1
removeRow(f2,1) if count==17 then count=1 end
end local t=BGblockList[count]
end 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 end
function timeSort(a,b) function timeSort(a,b)
@@ -55,4 +60,7 @@ end
function stencil_field() function stencil_field()
gc.rectangle("fill",0,-10,300,610) gc.rectangle("fill",0,-10,300,610)
end end
function stencil_field_small()
gc.rectangle("fill",0,0,300,600)
end
--Single use --Single use