Compare commits

..

5 Commits
v0.5 ... v0.7.2

Author SHA1 Message Date
MrZ_26
f0cca3092a Alpha V0.7.2 2020-02-04 19:29:42 +08:00
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 1442 additions and 587 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.

51
ai.lua
View File

@@ -1,12 +1,12 @@
--[[
HighestBlock
HorizontalTransitions
VerticalTransitions
BlockedCells
Wells
FilledLines
TetrisShape
BlockedWells;
HighestBlock
HorizontalTransitions
VerticalTransitions
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells;
]]
dirCount={1,1,3,3,3,0,1}
spinOffset={
@@ -18,7 +18,8 @@ spinOffset={
{0,0,0},--O
{2,0,1},--I
}for i=1,7 do spinOffset[i][0]=0 end
--[[controlname:
--[[
controlname:
1~5:mL,mR,rR,rL,rF,
6~9:hD,sD,H,R,
10~12:LL,RR,DD
@@ -45,6 +46,7 @@ FCL={
FCL[2]=FCL[1]
FCL[4]=FCL[3]
FCL[5]=FCL[3]
clearScore={[0]=0,0,10,30,100}
function ifoverlapAI(f,bk,x,y)
if y<1 then return true end
if y>#f then return nil end
@@ -63,7 +65,8 @@ function resetField(f0,f,start)
end
end
end
function getScore(field,cb,cx,cy)
function getScore(field,bn,cb,cx,cy)
local score=0
local highest=0
local height=getNewRow()
local rough=0
@@ -94,20 +97,28 @@ function getScore(field,cb,cx,cy)
end
end
end
local h1,mh1=0,0
for x=1,9 do
local dh=abs(height[x]-height[x])
if dh>1 then
rough=rough+min(dh^2,10)
rough=rough+min(dh^1.5,10)
elseif dh==1 then
h1=h1+1
if h1>mh1 then mh1=h1 end
else
h1=0
end
end
ins(freeRow,height)
return
-highest*5
-rough*15
-cy*20
-#cb*10
+clear^2*4
-hole*15
score=
-cy*20
-rough*20
-#cb*10
+clearScore[clear]
-hole*30
if #field>6 then score=score-highest*5 end
if mh1>3 then score=score-50-mh1*40 end
return score
end
function AI_getControls(ctrl)
local Tfield={}--test field
@@ -119,7 +130,7 @@ function AI_getControls(ctrl)
end
end
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]
for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir]
@@ -137,7 +148,7 @@ function AI_getControls(ctrl)
end
end
end--simulate lock
local score=getScore(Tfield,cb,cx,cy)
local score=getScore(Tfield,bn,cb,cx,cy)
if score>best.score then
best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score}
end

View File

@@ -58,38 +58,85 @@ function keyDown.mode(key)
if modeSel>1 then modeSel=modeSel-1 end
elseif key=="return"then
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
back()
end
end
function keyDown.setting2(key)
if key=="escape"then
back()
keysetting,gamepadsetting=nil
elseif keysetting then
setting.key[keysetting]=key
keysetting,gamepadsetting=nil
else
buttonControl_key(key)
if keyboardSetting then
keyboardSetting=false
else
back()
end
elseif keyboardSetting then
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
function keyDown.play(key)
local k=players[1].gameEnv.key
for i=1,11 do
if key==k[i]then
pressKey(i)
break
if key=="escape"then back()return nil end
local m=setting.keyMap
for p=1,4 do
local lib=setting.keyLib[p]
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
if key=="escape"then back()end
end
keyUp={}
function keyUp.play(key)
local k=players[1].gameEnv.key
for i=1,10 do
if key==k[i]then
releaseKey(i,players[1])
break
local m=setting.keyMap
for p=1,4 do
local lib=setting.keyLib[p]
for s=1,#lib do
for k=1,12 do
if key==m[lib[s]][k]then
releaseKey(k,players[p])
return nil
end
end
end
end
end
@@ -107,32 +154,60 @@ function gamepadDown.mode(key)
end
function gamepadDown.setting2(key)
if key=="back"then
back()
keysetting,gamepadsetting=nil
elseif gamepadsetting then
setting.gamepad[gamepadsetting]=key
keysetting,gamepadsetting=nil
else
buttonControl_gamepad(key)
if joystickSetting then
joystickSetting=false
else
back()
end
elseif joystickSetting then
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
function gamepadDown.play(key)
local k=players[1].gameEnv.gamepad
for i=1,11 do
if key==k[i]then
pressKey(i)
break
if key=="back"then back()return nil end
local m=setting.keyMap
for p=1,4 do
local lib=setting.keyLib[p]
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
if key=="escape"then back()end
end
gamepadUp={}
function gamepadUp.play(key)
local k=players[1].gameEnv.gamepad
for i=1,10 do
if key==k[i]then
releaseKey(i,players[1])
break
local m=setting.keyMap
for p=1,4 do
local lib=setting.keyLib[p]
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
@@ -163,7 +238,7 @@ function love.mousepressed(x,y,k,t,num)
if not t then
mouseShow=true
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 not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
@@ -173,7 +248,7 @@ function love.mousepressed(x,y,k,t,num)
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==3 then
elseif k==2 then
back()
end
end
@@ -189,7 +264,15 @@ function love.touchpressed(id,x,y)
if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
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
@@ -210,6 +293,13 @@ function love.touchreleased(id,x,y)
if t then
releaseKey(t)
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
function love.touchmoved(id,x,y,dx,dy)
@@ -237,11 +327,9 @@ function love.touchmoved(id,x,y,dx,dy)
elseif scene=="setting3"then
x,y=convert(x,y)
dx,dy=dx*screenK,dy*screenK
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
b[1],b[2]=b[1]+dx,b[2]+dy
end
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
end
@@ -251,6 +339,7 @@ function love.keypressed(i)
elseif i=="escape"or i=="back"then back()
else buttonControl_key(i)
end
if i=="f12"then devMode=true end
end
function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i)
@@ -258,23 +347,6 @@ function love.keyreleased(i)
end
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)
elseif i=="back"then return back()
else buttonControl_gamepad(i)
@@ -284,7 +356,17 @@ function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i)
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)
if wheelmoved[scene]then wheelmoved[scene](x,y)end
end
@@ -301,10 +383,12 @@ function love.update(dt)
BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end
end
BGblock.ct=BGblock.ct-1
if BGblock.ct==0 then
ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30)
if setting.bgblock then
BGblock.ct=BGblock.ct-1
if BGblock.ct==0 then
ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30)
end
end
--Background blocks update
@@ -324,10 +408,14 @@ function love.update(dt)
end
--scene swapping & Timer
end
function love.sendData(data)
return nil
end
function love.receiveData(id,data)
return nil
end
function love.draw()
gc.clear()
Pnt.BG[curBG]()
gc.setColor(1,1,1,.3)
for n=1,#BGblock do
@@ -347,31 +435,33 @@ function love.draw()
end
if sceneSwaping then sceneSwaping.draw()end
gc.setColor(0,0,0)
if screenM>0 then
gc.rectangle("fill",0,0,1280,-screenM)
gc.rectangle("fill",0,720,1280,screenM)
end--Draw black side
setFont(20)gc.setColor(1,1,1)
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
end
function love.resize(x,y)
screenK=1280/gc.getWidth()
screenM=(gc.getHeight()*16/9-gc.getWidth())/2
gc.origin()
gc.scale(1/screenK,1/screenK)
gc.translate(0,screenM)
function love.resize(w,h)
ww,wh=w,h
xOy:release()
ScreenK=h/w>=.5625 and w/1280 or h/720
xOy=love.math.newTransform(0,0,nil,ScreenK,nil,640,360,nil,nil)
xOy:translate(640,360)
if h/w>=.5625 then
xOy:translate(0,h-w*.5625)
else
xOy:translate(w-h*16/9,0)
end
gc.replaceTransform(xOy)
end
function love.run()
local frameT=Timer()
local readyDrawFrame=0
tm.step()
love.resize(nil,gc.getHeight())
love.resize(gc.getWidth(),gc.getHeight())
game.load()--System scene Launch
math.randomseed(os.time()*626)--true A-lthour's ID!
math.randomseed(os.time()*626)
return function()
love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do
@@ -389,7 +479,7 @@ function love.run()
love.draw()
gc.present()
end
if not wd.hasFocus()then
if not(wd.hasFocus()or keeprun)then
focus=false
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
@@ -402,8 +492,9 @@ function love.run()
end
end
else
tm.sleep(.1)
tm.sleep(.2)
if wd.hasFocus()then
tm.step()
focus=true
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end

BIN
cb.ttf

Binary file not shown.

View File

@@ -5,11 +5,11 @@ function love.conf(t)
t.version="11.1"
t.console=X
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
local W=t.window
W.title="Techmino V0.5"
W.title="Techmino V0.7.2"
W.icon="/image/icon.png"
W.width,W.height=1280,720
W.borderless=X
@@ -17,7 +17,7 @@ function love.conf(t)
W.minwidth,W.minheight=640,360
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
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.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

View File

@@ -1,12 +1,11 @@
function resetGameData()
if players then restockRow()end--Avoid first start game error
players={alive={}}
loadmode[gamemode]()
frame=0
count=179
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
PTC.dust[i]=PTC.dust[0]:clone()
PTC.dust[i]:start()
@@ -18,7 +17,7 @@ function resetGameData()
freeRow={}
collectgarbage()
for i=1,50*#players do
for i=1,40*#players do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end
end
@@ -42,10 +41,13 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.control=false
P.timing=false
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,pc=0}--Current gamestat
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.field,P.visTime,P.atkBuffer={},{},{}
P.badge,P.strength,P.lastRecv=0,0,nil
P.gameEnv={}--Game setting vars,like dropDelay setting
for k,v in pairs(gameEnv0)do
if data and data[k]~=nil then
@@ -59,25 +61,26 @@ function createPlayer(id,x,y,size,AIspeed,data)
end
end--reset current game settings
P.field,P.visTime,P.atkBuffer={},{},{}
P.hn,P.hb,P.holded=0,{{}},false
P.nxt,P.nb={},{}
P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock
P.freshTime=0
P.lastSpin=false
if P.gameEnv.sequence<5 then
local bag1={1,2,3,4,5,6,7}
for i=1,7 do
P.nxt[i]=rem(bag1,rnd(#bag1))
P.nb[i]=blocks[P.nxt[i]][0]
end--First bag
end
local bag1={1,2,3,4,5,6,7}
for i=1,7 do
P.nxt[i]=rem(bag1,rnd(#bag1))
P.nb[i]=blocks[P.nxt[i]][0]
end--First bag
P.freshNext=freshMethod[P.gameEnv.sequence]
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==3 then--Pure random
end
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.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
P.moving,P.downing=0,0
@@ -89,11 +92,15 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.b2b=0
P.b2b1=0
P.counter=0
P.result=nil--string,"win"/"lose"
P.task={}
P.bonus={}
end
function showText(text,type,font,dy)
ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0})
function showText(text,type,font,dy,inf)
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
function createBeam(s,r,lv)--Player id
S,R=players[s],players[r]
@@ -110,18 +117,33 @@ function createBeam(s,r,lv)--Player id
end
ins(FX.beam,{x1,y1,x2,y2,t=0,lv=lv})
end
function freshgho()
if not P.gameEnv._20G then
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
function throwBadge(s,r,amount)--Player id
s,r=players[s],players[r]
local x1,y1,x2,y2
if s.small then
x1,y1=s.x+150*s.size,s.y+300*s.size
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
P.cy=P.cy-1
P.spinLast=false
end
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
function freshLockDelay()
@@ -200,7 +222,7 @@ function pressKey(i,player)
ins(keyTime,1,frame)rem(keyTime,11)
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
end
-- if playmode=="recording"then ins(rec,{i,frame})end
@@ -215,7 +237,7 @@ function spin(d,ifpre)
if bn==6 then
freshgho()--May cancel spinLast
freshLockDelay()
SFX(ifpre and"prerotate"or ifoverlap(cb,cx,cy+1)and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and"rotatekick"or"rotate")
SFX(ifpre and"prerotate"or"rotate")
if id==1 then
stat.rotate=stat.rotate+1
end
@@ -275,9 +297,9 @@ function hold(ifpre)
end
end
function drop()
if cy==y_img then
ins(dropTime,1,frame)rem(dropTime,11)--update speed dial
P.waiting=gameEnv.wait
if P.cy==P.y_img then
ins(P.dropTime,1,frame)rem(P.dropTime,11)--update speed dial
P.waiting=P.gameEnv.wait
local dospin=bn~=6 and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and ifoverlap(cb,cx,cy+1)and 1 or 0
if bn<6 and spinLast then
@@ -296,31 +318,33 @@ function drop()
if dospin==0 then dospin=false end
lock()
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<6 and dospin==1 and cc<3 and cc<r
P.combo=P.combo+1--combo=0 is under
if cc==4 then
if b2b>480 then
showText("Tetris B2B2B","fly",70)
showText("Techrash B2B2B","fly",70)
csend=6
sendTime=80
exblock=exblock+1
elseif b2b>=100 then
showText("Tetris B2B","drive",70)
elseif b2b>=30 then
showText("Techrash B2B","drive",70)
sendTime=70
csend=5
else
showText("Tetris","stretch",80)
showText("Techrash","stretch",80)
sendTime=60
csend=4
end
P.b2b=P.b2b+100
sendTime=60
P.cstat.tetris=P.cstat.tetris+1
P.cstat.techrash=P.cstat.techrash+1
elseif cc>0 then
if dospin then
if b2b>480 then
showText(spinName[cc][bn].." B2B2B","spin",40)
csend=b2bATK[cc]+1
exblock=exblock+1
elseif b2b>=100 then
elseif b2b>=30 then
showText(spinName[cc][bn].." B2B","spin",40)
csend=b2bATK[cc]
else
@@ -330,17 +354,18 @@ function drop()
sendTime=20+csend*20
if mini then
showText("Mini","drive",40,10)
csend=ceil(csend*.5)
sendTime=sendTime+60
P.b2b=P.b2b+90+10*cc
P.b2b=P.b2b+b2bPoint[cc]*.8
else
P.b2b=P.b2b+70+30*cc
P.b2b=P.b2b+b2bPoint[cc]
end
SFX(spin_n[cc])
if id==1 then
stat.spin=stat.spin+1
end
elseif #clearing<#field then
P.b2b=P.b2b-300
P.b2b=P.b2b-150-cc*50
showText(clearName[cc],"appear",50)
csend=cc-1
sendTime=20+csend*20
@@ -350,17 +375,20 @@ function drop()
if dospin then
showText(spinName[0][bn],"appear",50)
SFX("spin_0")
P.b2b=b2b+40
P.b2b=P.b2b+15
end
end
if cc>0 and #clearing==#field then
showText("Perfect Clear","flicker",70,-80)
csend=csend+5
csend=csend+min(6+P.cstat.pc,10)
exblock=exblock+2
sendTime=sendTime+30
SFX("perfectclear")
P.b2b=b2b+150
if cstat.piece>10 then
P.b2b=300
end
P.cstat.pc=P.cstat.pc+1
end
csend=csend+(renATK[combo]or 4)
@@ -375,11 +403,14 @@ function drop()
P.b2b=max(min(b2b,600),0)
if csend>0 then
if mini then csend=int(csend*.7)end
--mini attack decrease
if exblock then exblock=int(exblock*(1+P.strength*.25))end
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
if P.id==1 then stat.atk=stat.atk+csend end
--ATK statistics
while csend>0 and P.atkBuffer[1]do
@@ -397,18 +428,26 @@ function drop()
P.atkBuffer[1].lv=s<4 and 1 or s<7 and 2 or 3
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
if P.b2b>480 then
P.b2b=max(P.b2b-40,480)
end
garbageRelease()
end--Send attack
end
if id==1 then
stat.piece,stat.row=stat.piece+1,stat.row+cc
end
P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc
if P.cstat.row>=gameEnv.target then
gameEnv.reach()
if control then SFX("reach")end
end
P.spinLast=dospin and cc>0
else
P.cy=cy-1
P.spinLast=false
@@ -434,6 +473,7 @@ function garbageSend(sender,send,time)
until r~=P.id
createBeam(sender,r,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)
end
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

387
list.lua
View File

@@ -1,3 +1,32 @@
--[["four name"
Techrash
Techmino
Tequéno
Zestris
Quadruple
Tequeno
Techzino
Tectris
]]
PCbase={
{3,3,3,0,0,0,0,0,2,2},
{3,6,6,0,0,0,0,2,2,5},
{4,6,6,0,0,0,1,1,5,5},
{4,4,4,0,0,0,0,1,1,5},
{1,1,0,0,0,0,0,3,3,3},
{5,1,1,0,0,0,0,6,6,3},
{5,5,2,2,0,0,0,6,6,4},
{5,2,2,0,0,0,0,4,4,4},
}
PClist={--ZSLJTOI
{7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,4,1,2},{7,3,5,7},{7,7,5,6},{7,7,5,2},
{7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2},{7,5,6,4},{7,5,3,6},
{7,2,5,6},{7,2,1,3},{7,2,6,4},{7,5,2,7},{7,3,1,5},{7,3,2,5},{7,4,1,5},{7,4,2,5},
{7,7,3,6},{7,3,7,6},{7,3,6,2},{7,3,7,1},{7,6,4,2},{3,2,7,6},{7,5,3,4},{7,3,6,5},
{7,3,2,5},{7,4,6,5},{7,6,4,5},{7,5,2,3},{7,3,5,7},{7,3,2,5},{7,3,5,1},{7,5,2,3},
{3,6,2,5},{3,1,2,5},{3,5,1,2},{4,5,3,2},{4,2,6,5},{6,5,3,2},{1,4,2,5},{1,5,3,6},
{5,2,6,3},{5,2,1,3},{2,4,1,5},{2,4,5,1},{2,1,4,5},{2,5,4,3},{2,5,6,7},{7,5,4,2},
}
color={
red={1,0,0},
green={0,1,0},
@@ -15,9 +44,16 @@ color={
lightCyan={.5,1,1},
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},
white={1,1,1},
orange={1,.6,0}
orange={1,.6,0},
}
attackColor={
{color.red,color.yellow},
@@ -35,6 +71,13 @@ attackColor={
end,
}--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"}
blockColor={
color.red,
@@ -57,39 +100,126 @@ for j=1,7 do
spinName[0][j]=blockName[j].." spin"
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={
load=love.event.quit,
ready="mode",
play="mode",
play=function()
gotoScene(gamemode~="custom"and"mode"or"custom")
end,
mode="main",
custom="mode",
help="main",
stat="main",
setting="main",
setting=function()
saveSetting()
gotoScene("main")
end,
setting2="setting",
setting3="setting",
intro="quit",
main="quit",
}
modeID={"sprint","marathon","zen","solo","death","blind","tetris41","asymsolo","gmroll",}
modeName={"Sprint","Marathon","Zen","Solo","Death","Blind","Tetris 41","Asymmetry solo","GM roll",}
modeID={"sprint","marathon","zen","infinite","solo","death","tsd","blind","pc","techmino41","techmino99","gmroll","p2","p3","p4"}
modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","TSD-only","Blind","PC Puzzle","Techmino41","Techmino99","GM roll","2P","3P","4P"}
modeInfo={
sprint="Clear 40 Lines",
marathon="Clear 200 Lines",
zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI",
death="Survive under terrible speed",
tsd="T-spin-double Only!",
blind="Invisible board!",
tetris41="Melee fight with 40 AIs",
asymsolo=" See-->",
pc="Make as much PCs as you can",
techmino41="Melee fight with 40 AIs",
techmino99="Melee fight with 98 AIs",
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"}
actName_show={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight","toDown"}
customID={
"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}
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",}
b2bPoint={50,90,150}
b2bATK={3,5,8}
spin_n={"spin_1","spin_2","spin_3"}
@@ -98,9 +228,14 @@ 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%",}
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_wait={6,5,4,3,2}
death_fall={10,8,7,6,5}
death_lock={10,9,9,8,8}
death_wait={6,6,5,5,4}
death_fall={10,9,8,7,6}
pc_drop={50,40,30,22,16,12,10,8,6,5,4,3,2,1}
pc_lock={50,40,32,25,20,17,15,12,10}
pc_fall={18,16,14,12,10,9,8,7,6,5}
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}
snapLevelValue={1,10,20,40,60,80}
act={
moveLeft=function(auto)
@@ -135,7 +270,10 @@ act={
end
end,
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
end,
rotRight=function()spin(1)end,
@@ -147,11 +285,35 @@ act={
resetGameData()
count=60+26--Althour'z neim
end,
down1=function()if cy~=y_img then P.cy=cy-1 end end,
down4=function()for i=1,4 do if cy~=y_img then P.cy=cy-1 else break end end end,
toDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end,
toLeft=function()while not ifoverlap(cb,cx-1,cy)do P.cx,P.lockDelay=cx-1,gameEnv.lock;freshgho()end end,
toRight=function()while not ifoverlap(cb,cx+1,cy)do P.cx,P.lockDelay=cx+1,gameEnv.lock;freshgho()end end,
insDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end,
insLeft=function()
while not ifoverlap(cb,cx-1,cy)do
P.cx,P.lockDelay=cx-1,gameEnv.lock
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,
--System movements
}
@@ -177,38 +339,38 @@ TRS={
[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}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{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},{1,0},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{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}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[02]={{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}},
[31]={{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}},
},--Z/J
[2]={
[01]={{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}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}},
[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}},
[12]={{0,0},{1,0},{1,-1},{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},{-1,0},{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},{-1,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}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{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}},
},
[13]={{0,0},{0,1},{0,-1},{1,0}},
[31]={{0,0},{0,-1},{0,1},{-1,0}},
},--S/L
[5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{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},{1,1}},
[12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}},
[32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-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}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
@@ -217,14 +379,14 @@ TRS={
[31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}},
},
[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}},
[12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[21]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[23]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}},
[21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}},
[23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}},
[32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}},
[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}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
@@ -240,22 +402,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=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=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={
{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=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=600,w=180,h=80,rgb=color.green,t="Start",hide=function()return not setting.virtualkeySwitch end,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=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,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end},
{x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",code=function()startGame(modeID[modeSel])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={
},
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=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=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},
{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=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end,
{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=5,left=1,right=11},
--1,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=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()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
@@ -263,79 +445,58 @@ Buttons={
love.resize(gc.getWidth(),gc.getHeight())
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=435,y=300,w=320,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=6,down=8,right=5},
{x=640,y=590,w=210,h=60,rgb=color.white,t="Save&Back",code=function()saveSetting()back()end,up=6},
},
setting2={--Advanced setting
{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},
{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},
{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},
{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},
{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},
{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},
{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},
--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()
{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,
code=function()
setting.bgblock=not setting.bgblock
if not setting.bgblock then
for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v
end
end
end,
up=12,down=15,left=10
},
--11~14
{x=870,y=340,w=340,h=60,rgb=color.white,t=function()return"frameDraw:"..setting.frameMul.."%"end,code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end
end,up=24,down=29,left=11},
{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=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,up=24,left=28},
--27~29
end,up=14,down=16},
{x=870,y=420,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=15,down=17},
{x=870,y=500,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=16,down=18},
{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
{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
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
local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey
end},
{x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40
end--Snap all keys
{x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function()
snapLevel=snapLevel%6+1
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
--Adjust virtualkey alpha
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
--Switch virtualkey icon
end},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end},
{x=780,y=410,w=120,h=80,rgb=color.white,t="Size",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
{x=830,y=410,w=170,h=80,t="Size",code=function()
if sel then
local b=virtualkey[sel]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
@@ -343,10 +504,11 @@ Buttons={
end},
},
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={
{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)
}
@@ -355,6 +517,7 @@ for k,v in pairs(Buttons)do
v[i].alpha=0
end
end
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
@@ -388,7 +551,7 @@ Text={
},
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",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
@@ -396,7 +559,7 @@ Text={
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:farter,teatube,flyz,and YOU!!",
"Special thanks:farter,teatube,flyz,t830,[all test staff] and YOU!!",
"Any bugs/suggestions to my E-mail.",
},
}

536
main.lua
View File

@@ -1,22 +1,34 @@
gc,kb,ms,tc,tm,fs,wd=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window
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
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=love.system.getOS()
system=sys.getOS()
touching=nil--1st touching ID
scene=""
gamemode=""
bgmPlaying=nil
curBG="none"
BGblock={ct=140}
BGblock={ct=140,next=7}
kb.setKeyRepeat(false)
kb.setTextInput(false)
@@ -28,7 +40,7 @@ function setFont(s)
if Fonts[s]then
gc.setFont(Fonts[s])
else
local t=gc.setNewFont("cb.ttf",s)
local t=gc.setNewFont("siyuanhei.otf",s-5)
Fonts[s]=t
gc.setFont(t)
end
@@ -36,40 +48,16 @@ function setFont(s)
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={
das=10,arr=2,
sddas=0,sdarr=2,
ghost=true,center=true,
drop=30,lock=45,
wait=0,fall=20,
wait=1,fall=1,
next=6,hold=true,
sequence=1,visible=1,
_20G=false,target=9e99,
freshLimit=9e99,
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"},
_20G=false,target=1e99,
freshLimit=1e99,
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
@@ -81,45 +69,84 @@ gameEnv0={
{1280-80,720-400,6400,80},--hold
{80,80,6400,80},--restart
},
reach=function()end,
--these three is actually no use,only provide a key
reach=null,
--not all is actually used,some only provide a key
}
randomMethod={
customSel={
drop=20,
lock=20,
wait=1,
fall=1,
next=7,
hold=1,
sequence=1,
visible=1,
target=4,
freshLimit=3,
opponent=1,
}
freshMethod={
function()
P.bn,P.cb=rem(nxt,1),rem(nb,1)
if #nxt<6 then
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #P.nxt<6 then
local bag={1,2,3,4,5,6,7}
for i=1,7 do
ins(nxt,rem(bag,rnd(8-i)))
ins(P.nxt,rem(bag,rnd(8-i)))
ins(P.nb,blocks[P.nxt[#P.nxt]][0])
end
end
for i=6,#nxt do
nb[i]=blocks[nxt[i]][0]
end
end,
function()
P.bn,P.cb=rem(nxt,1),rem(nb,1)
for j=1,4 do
local i,f=rnd(7)
for k=1,4 do
if i==his[k]then f=true end
end
if not f then break end
end
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
local i,j=nil,0
::r::
i,j=rnd(7),j+1
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
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,
function()
P.bn,P.cb=rem(nxt,1),rem(nb,1)
repeat i=rnd(7)until i~=nxt[5]
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
repeat i=rnd(7)until i~=P.nxt[5]
P.nxt[6],P.nb[6]=i,blocks[i][0]
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #P.nxt<6 then
local bag={1,2,3,4,5,6,7}
for i=1,7 do
ins(P.nxt,rem(bag,rnd(8-i)))
ins(P.nb,blocks[P.nxt[#P.nxt]][0])
end
if rnd()>.4 then
ins(P.nxt,5)
ins(P.nb,blocks[5][0])
end
end
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if P.cstat.piece%4==0 then
local r=rnd(#PClist)
local P=players[1]
local f=P.cstat.pc%2==0
for i=1,4 do
local b=PClist[r][i]
if f then
if b<3 then b=3-b
elseif b<5 then b=7-b
end
end
ins(P.nxt,b)
ins(P.nb,blocks[b][0])
end
end
end,
}
loadmode={
sprint=function()
modeEnv={
wait=1,
fall=1,
drop=60,
target=40,
reach=Event.gameover.win,
}
@@ -131,14 +158,21 @@ loadmode={
modeEnv={
drop=1e99,
lock=1e99,
wait=1,
fall=1,
target=200,
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="strap"
BGM("reason")
BGM("infinite")
end,
infinite=function()
modeEnv={
drop=1e99,
lock=1e99,
}
createPlayer(1,340,15)
curBG="glow"
BGM("infinite")
end,
gmroll=function()
modeEnv={
@@ -158,7 +192,6 @@ loadmode={
marathon=function()
modeEnv={
drop=60,
wait=1,
fall=20,
target=10,
reach=Event.marathon_reach,
@@ -184,23 +217,86 @@ loadmode={
curBG="game2"
BGM("push")
end,
tetris41=function()
tsd=function()
modeEnv={
wait=1,
fall=1,
drop=60,
lock=60,
sequence=4,
target=1,
reach=Event.tsd_reach,
freshLimit=10,
}
createPlayer(1,340,15)
curBG="matrix"
BGM("infinite")
end,
pc=function()
modeEnv={
next=4,
hold=false,
drop=60,
lock=60,
fall=20,
sequence=5,
target=0,
reach=Event.newPC,
freshLimit=5,
}
createPlayer(1,340,15)
local r=rnd(#PClist)
local P=players[1]
for i=1,4 do
local b=PClist[r][i]
ins(P.nxt,b)
ins(P.nb,blocks[b][0])
end
Event.newPC()
curBG="matrix"
BGM("infinite")
end,
techmino41=function()
modeEnv={
freshLimit=15,
royaleMode=true,
royale={2,5,10,20},
}
createPlayer(1,340,15)--Player
local n=2
for i=1,4 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,rnd(15))
n=n+1
end
end
for i=9,12 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,rnd(15))
n=n+1
end
end--AIs
curBG="game3"
BGM("race")
end,
techmino99=function()
modeEnv={
freshLimit=15,
royaleMode=true,
royale={2,6,14,30},
}
createPlayer(1,340,15)--Player
local n=2
for i=1,7 do
for j=1,7 do
createPlayer(n,46*i-36,97*j-72,.135,rnd()<.1 and rnd(4)or rnd(10,20))
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()<.1 and rnd(4)or rnd(10,20))
n=n+1
end
end--AIs
@@ -210,8 +306,6 @@ loadmode={
end,
solo=function()
modeEnv={
wait=1,
fall=1,
freshLimit=15,
}
createPlayer(1,20,15)--Player
@@ -224,8 +318,6 @@ loadmode={
modeEnv={
drop=15,
lock=30,
wait=1,
fall=1,
visible=0,
freshLimit=10,
}
@@ -234,18 +326,55 @@ loadmode={
curBG="glow"
BGM("push")
end,
asymsolo=function()
p2=function()
modeEnv={
wait=1,
fall=1,
visible=2,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI
createPlayer(1,20,15)
createPlayer(2,650,15)
curBG="game2"
BGM("race")
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={
@@ -255,21 +384,39 @@ Event={
P.control=false
P.timing=false
P.waiting=1e99
P.control=false
gameover=0
P.result="WIN"
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)
end,
lose=function()
P.alive=false
P.control=false
P.timing=false
P.result=" K.O."
P.waiting=1e99
P.b2b=0
gameover=0
showText("LOSE","appear",100,nil,true)
if modeEnv.royaleMode and P.lastRecv then
throwBadge(P.id,P.lastRecv,P.badge)
players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1
local atker=players[P.lastRecv]
while atker.strength<4 and atker.badge>modeEnv.royale[atker.strength+1]do
atker.strength=atker.strength+1
end
end
for i=1,#players.alive do
if players.alive[i]==P.id then
rem(players.alive,i)
if #players.alive==1 then
ins(players[players.alive[1]].task,Event.task.winTrigger)
end
break
end
end
@@ -277,17 +424,24 @@ Event={
P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0
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)
end,
},
marathon_reach=function()
local s=int(P.cstat.row*.1)
local s=int(cstat.row*.1)
if s>=20 then
Event.gameover.win()
else
gameEnv.drop=marathon_drop[s]
if s==18 then gameEnv._20G=true end
gameEnv.target=s*10+10
SFX("reach")
end
end,
death_reach=function()
@@ -303,35 +457,99 @@ Event={
SFX("reach")
end
end,
task={
win=function()
gameover=gameover+1
if gameover%3==0 then
local j=gameover/3
if j<=#field then
for i=1,10 do
if field[j][i]>0 then field[j][i]=13 end
end
if j==#field then gameover=50 end
tsd_reach=function()
P.gameEnv.target=P.gameEnv.target+2
if not(#clearing==2 and bn==5 and P.spinLast)then
Event.gameover.lose()
end
end,
newPC=function()
local P=players[1]
if #P.field==#P.clearing then
P.counter=P.cstat.piece==0 and 19 or 0
ins(P.task,Event.task.PC)
local s=P.cstat.pc*.5
if int(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 0
P.gameEnv.lock=pc_lock[s]or 10
P.gameEnv.fall=pc_fall[s]or 5
if s==15 then
showText("Max speed","appear",80,-120)
else
showText("Speed up","appear",30,-130)
end
end
if gameover>80 then
return true
else
Event.gameover.lose()
end
end,
task={
winTrigger=function()
Event.gameover.win()
return true
end,
win=function()
P.counter=P.counter+1
if P.counter>60 then
for i=1,#field do
for j=1,10 do
if visTime[i][j]>0 then
visTime[i][j]=visTime[i][j]-1
end
end
end
if P.counter==100 then
for i=1,#field do
removeRow(field)
removeRow(visTime)
end
return true
end
end
end,
lose=function()
gameover=gameover+1
if gameover%3==0 then
local j=gameover/3
if field[j]then
for i=1,10 do
if field[j][i]>0 then field[j][i]=13 end
P.counter=P.counter+1
if P.counter>60 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.counter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end
else
return true
end
end
end,
garbagepush=function()
end,
PC=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==21 then
gameEnv.target=gameEnv.target+4
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,
},
}
mesDisp={
@@ -344,61 +562,119 @@ mesDisp={
setFont(75)
mStr(max(200-P.cstat.row,0),-75,280)
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,
solo=function()
setFont(50)
mStr(cstat.atk,-75,320)
setFont(20)
gc.print("Attack",-100,360)
end,
gmroll=function()
setFont(35)
gc.print("Tetris",-120,390)
setFont(25)
gc.print("Techrash",-120,420)
setFont(80)
mStr(cstat.tetris,-75,420)
mStr(cstat.techrash,-75,350)
end,
marathon=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377)
gc.rectangle("fill",-120,376,90,4)
end,
death=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377)
gc.rectangle("fill",-120,376,90,4)
end,
tetris41=function()
gc.print("Remain",-140,450)
gc.print("Attack",-130,305)
tsd=function()
setFont(35)
gc.print("TSD",-105,405)
setFont(80)
mStr(#players.alive,-75,380)
mStr(cstat.atk,-75,240)
mStr((P.gameEnv.target-1)*.5,-75,330)
end,
pc=function()
setFont(25)
gc.print("Perfect Clear",-138,400)
setFont(80)
mStr(cstat.pc,-75,330)
end,
techmino41=function()
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,
techmino99=function()
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,
blind=function()
setFont(35)
gc.print("Rows",-115,220)
gc.print("Tetris",-120,390)
setFont(25)
gc.print("Rows",-100,300)
gc.print("Techrash",-120,420)
setFont(80)
mStr(P.cstat.row,-75,250)
mStr(cstat.tetris,-75,420)
end,
solo=function()
gc.print("Attack",-130,365)
setFont(80)
mStr(cstat.atk,-75,300)
end,
asymsolo=function()
gc.print("Attack",-132,365)
setFont(80)
mStr(cstat.atk,-75,300)
mStr(P.cstat.row,-75,230)
mStr(cstat.techrash,-75,350)
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
setting={
sfx=true,bgm=true,
fullscreen=false,
bgblock=true,
lang="eng",
das=10,arr=2,
sddas=0,sdarr=2,
ghost=true,center=true,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"},
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","RB","LB","LEFT","RIGHT","DOWN"},
keyMap={
{"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={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
@@ -428,21 +704,19 @@ stat={
spin=0,
}
--User Data&User Setting
--------------------------------Warning!_G is __indexed to players[n] when changing any player's data!
--------------------------------Wrning!_G __index Plyr[n] when chng any playr's val!
require("toolfunc")
require("gamefunc")
require("list")
require("texture")
require("BGblock")
require("ai")
require("toolfunc")
require("sysfunc")
require("gamefunc")
require("timer")
require("paint")
require("game_scene")
require("scene")
require("call&sys")
userData=fs.newFile("userData")
userSetting=fs.newFile("userSetting")
userData=fs.newFile("userdata")
userSetting=fs.newFile("usersetting")
if fs.getInfo("userdata")then
loadData()
end

266
paint.lua
View File

@@ -36,21 +36,22 @@ FX={
flash=0,--Black screen(frame)
shake=0,--Screen shake(frame)
beam={},--Attack beam
badge={},--badge thrown
appear=function(t,a)
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)
end,
fly=function(t,a)
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)
end,
stretch=function(t,a)
gc.push("transform")
setFont(t.font)
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
mStr(t.text,0,-t.font*.5)
gc.pop()
@@ -59,7 +60,7 @@ FX={
gc.push("transform")
setFont(t.font)
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
mStr(t.text,0,-t.font*.5)
gc.pop()
@@ -68,7 +69,7 @@ FX={
gc.push("transform")
setFont(t.font)
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.rotate((20-t.t)^2*.0015)
end
@@ -77,9 +78,19 @@ FX={
end,
flicker=function(t,a)
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)
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()
@@ -89,9 +100,10 @@ function drawButton()
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
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.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)
local t=B.t
local y0
@@ -104,7 +116,7 @@ function drawButton()
mStr(t,B.x-1,y0+2)
mStr(t,B.x+1,y0+2)
end
gc.setColor(B.rgb)
gc.setColor(C)
if t then
mStr(t,B.x,y0+1)
end
@@ -126,13 +138,22 @@ function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y)
end
function drawVirtualkey()
function drawVirtualkey(s)
gc.setLineWidth(10)
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
if s then
for i=1,#virtualkey do
gc.setColor(1,s==i and 0 or 1,s==i and 0 or 1,setting.virtualkeyAlpha*.2)
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
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
@@ -169,6 +190,16 @@ function Pnt.BG.strap()
gc.draw(background[2],x,0,nil,10)
gc.draw(background[2],x-1280,0,nil,10)
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
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
end
end
function Pnt.load()
gc.setLineWidth(4)
@@ -177,30 +208,21 @@ function Pnt.load()
gc.setColor(1,1,1)
gc.rectangle("line",340,340,640,40)
setFont(30)
mStr(Text.load[loading],640,345)
mStr(Text.load[loading],640,346)
setFont(20)
mStr("not animation,real loading!",640,392)
end
function Pnt.main()
gc.setColor(1,1,1)
setFont(30)
gc.print("Alpha V0.5",370,150)
gc.print("Alpha V0.7.2",370,150)
gc.print(system,530,110)
gc.draw(titleImage,30,30)
end
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)
mStr(modeInfo[modeID[modeSel]],270,300)
gc.setColor(color.white)
mStr(modeInfo[modeID[modeSel]],270,305)
setFont(80)
gc.setColor(color.grey)
mStr(modeName[modeSel],643,283)
@@ -213,6 +235,25 @@ function Pnt.mode()
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()
for p=1,#players do
P=players[p]
@@ -221,9 +262,8 @@ function Pnt.play()
gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setLineWidth(3)
gc.translate(10,15)
gc.stencil(stencil_field, "replace", 1)
gc.setLineWidth(13)
gc.stencil(stencil_field_small, "replace",1)
gc.translate(0,fieldBeneath)
gc.setStencilTest("equal",1)
for j=1,#field do
@@ -233,77 +273,26 @@ function Pnt.play()
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05)
end
end
else
gc.setColor(1,1,1,falling/gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30)
end
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.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask
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
for i=1,#atkBuffer do
local a=atkBuffer[i]
local bar=a.amount*30
if not a.sent then
if a.time<20 then
bar=bar*(20*a.time)^.5*.05
--Appear
end
if a.countdown>0 then
gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",305,600-h,8,-bar+5)
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.rectangle("fill",-15,600,10,-b2b1)
--B2B bar
for i=1,#bonus do
local a=#field>9-bonus[i].dy*.03333 and .6 or 1
bonus[i]:draw(a)
end--Effects
if P.result then
gc.setColor(1,1,1,min(P.counter,60)*.01)
setFont(100)
mStr(P.result,150,250)
end
gc.pop()
else
gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background
gc.setLineWidth(3)
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame
gc.setLineWidth(7)
gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame
gc.translate(150,70)
gc.stencil(stencil_field, "replace", 1)
gc.translate(0,fieldBeneath)
@@ -350,7 +339,7 @@ function Pnt.play()
gc.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask
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
for i=1,#atkBuffer do
@@ -363,31 +352,31 @@ function Pnt.play()
end
if a.countdown>0 then
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.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
else
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
end
else
gc.setColor(attackColor[a.lv][1])
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
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.rectangle("fill",-15,600,10,-b2b1)
gc.setColor(b2b<40 and color.white or b2b<=480 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-17,600,10,-b2b1)
gc.setColor(color.red)
gc.rectangle("line",-20,600-100,15,2)
gc.rectangle("fill",-23,600-40,16,5)
gc.setColor(color.blue)
gc.rectangle("line",-20,600-480,15,2)
gc.rectangle("fill",-23,600-480,16,5)
--B2B bar
setFont(40)
@@ -403,7 +392,7 @@ function Pnt.play()
end
end--Hold
gc.print("Next",336,0)
for N=1,gameEnv.next do
for N=1,min(gameEnv.next,#nxt)do
local b=nb[N]
for i=1,#b do
for j=1,#b[1] do
@@ -423,13 +412,12 @@ function Pnt.play()
gc.pop()
end--Draw starting counter
for i=1,#bonus do
local a=#field>(9-bonus[i].dy*.03333)and .7 or 1
bonus[i]:draw(a)
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))
end--Effects
gc.setColor(1,1,1)
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
setFont(15)
@@ -447,36 +435,70 @@ function Pnt.play()
for i=1,3 do
gc.draw(PTC.attack[i])
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)
if setting.virtualkeySwitch then
drawVirtualkey()
end
end
function Pnt.setting2()
function Pnt.setting()
gc.setColor(1,1,1)
setFont(18)
mStr("softdropDAS:"..setting.sddas,828,140)
mStr("softdropARR:"..setting.sdarr,1043,140)
setFont(35)
mStr("DAS:"..setting.das,828,73)
mStr("ARR:"..setting.arr,1043,73)
gc.print("Keyboard Joystick",223,10)
for i=1,9 do
gc.printf(actName_show[i]..":",0,60*i-8,180,"right")
mStr("DAS:"..setting.das,328,163)
mStr("ARR:"..setting.arr,543,163)
setFont(18)
mStr("softdropDAS:"..setting.sddas,328,250)
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
if keysetting or gamepadsetting then
gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10)
gc.rectangle("fill",240,40*keyboardSet-10,200,40)
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
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
function Pnt.setting3()
drawVirtualkey()
gc.setLineWidth(3)
gc.setColor(1,1,1,sin(Timer()*4)*.1+.1)
for i=1,31 do
gc.line(40*i,0,40*i,720)
end
for i=1,17 do
gc.line(0,40*i,1280,40*i)
drawVirtualkey(sel)
local d=snapLevelValue[snapLevel]
if d>=10 then
gc.setLineWidth(3)
gc.setColor(1,1,1,sin(Timer()*4)*.1+.1)
for i=1,1280/d-1 do
gc.line(d*i,0,d*i,720)
end
for i=1,720/d-1 do
gc.line(0,d*i,1280,d*i)
end
end
end
function Pnt.help()

View File

@@ -2,28 +2,31 @@ game={}
function game.load()
scene="load"
curBG="none"
keeprun=true
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar
end
function game.intro()
scene="intro"
curBG="none"
end
function game.main()
scene="main"
curBG="none"
keeprun=false
BGM("blank")
collectgarbage()
end
function game.mode()
saveData()
modeSel=modeSel or 1
if players then restockRow()end--collectGarbage
scene="mode"
curBG="none"
BGM("blank")
end
function game.custom()
optSel=optSel or 1
scene="custom"
curBG="matrix"
BGM("blank")
end
function game.play()
scene="play"
--curBG="game1"
@@ -35,17 +38,23 @@ function game.setting()
scene="setting"
curBG="none"
BGM("blank")
end--Normal setting
end
function game.setting2()
scene="setting2"
curBG="none"
keyssetting=nil
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
BGM("blank")
end--Advanced setting and keyboard&joystick setting
end--Control settings
function game.setting3()
scene="setting3"
curBG="game1"
sel=nil
keyssetting=nil
snapLevel=1
BGM("blank")
end--Touch setting
function game.help()

BIN
siyuanhei.otf Normal file

Binary file not shown.

View File

@@ -13,7 +13,7 @@ function sysSFX(s,v)
end
end
function SFX(s,v)
if setting.sfx then
if setting.sfx and not P.ai then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
@@ -23,10 +23,6 @@ function SFX(s,v)
break
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]:play()
end
@@ -112,14 +108,31 @@ function loadSetting()
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="keyset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.key=v
elseif t=="gamepadset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.gamepad=v
elseif t=="bgblock"then
setting.bgblock=v=="true"
elseif t=="keymap"then
v=string.splitS(v,"/")
for i=1,16 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
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
v=string.splitS(v,"/")
for i=1,9 do
@@ -154,17 +167,25 @@ function saveSetting()
end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
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({
stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm),
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("keyset=",table.concat(setting.key,"/")),
stringPack("gamepadset=",table.concat(setting.gamepad,"/")),
stringPack("keymap=",table.concat(map,"/")),
stringPack("keylib=",table.concat(lib,"/")),
stringPack("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon),

View File

@@ -1,15 +1,24 @@
setFont(80)
charV=gc.newText(Fonts[80],"v")
local N=gc.newImage
function C(x,y)
c=gc.newCanvas(x,y)
gc.setCanvas(c)
end
titleImage=N("/image/mess/title.png")
mouseIcon=N("/image/mess/mouseIcon.png")
spinCenter=N("/image/mess/spinCenter.png")
dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png")
blockSkin={}
local img=N("/image/block/1.png")
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
img:release()
background={}
gc.setColor(1,1,1)
background={
@@ -23,7 +32,7 @@ end
PTC={dust={}}--Particle systems
c=gc.newCanvas(6,6)gc.setCanvas(c)
C(6,6)
gc.clear(1,1,1)
PTC.dust[0]=gc.newParticleSystem(c,1000)
PTC.dust[0]:setParticleLifetime(.2,.3)
@@ -34,19 +43,19 @@ c:release()
--Dust particles
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]:setEmissionRate(0)
PTC.attack[1]:setSpin(10)
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]:setEmissionRate(0)
PTC.attack[2]:setSpin(8)
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]:setEmissionRate(0)
PTC.attack[3]:setSpin(6)

View File

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

View File

@@ -1,5 +1,4 @@
function string.splitS(s,sep)
sep=sep or"/"
local t={}
repeat
local i=find(s,sep)or #s+1
@@ -16,9 +15,11 @@ function without(t,v)
end
return true
end
function mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end
function mStr(s,x,y)
gc.printf(s,x-500,y,1000,"center")
end
function convert(x,y)
return x*screenK,(y-screenM)*screenK
return xOy:inverseTransformPoint(x,y)
end
function getNewRow(val)
@@ -39,14 +40,20 @@ end
function removeRow(t,k)
ins(freeRow,rem(t,k))
end
function restockRow()
for p=1,#players do
local f,f2=players[p].field,players[p].visTime
while #f>0 do
removeRow(f,1)
removeRow(f2,1)
end
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
function timeSort(a,b)
@@ -55,4 +62,207 @@ end
function stencil_field()
gc.rectangle("fill",0,-10,300,610)
end
--Single use
function stencil_field_small()
gc.rectangle("fill",0,0,300,600)
end
--Single use
function sysSFX(s,v)
if setting.sfx then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
end
end
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
end
function SFX(s,v)
if setting.sfx and not P.ai then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
break
end
end
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
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
bgmPlaying=s
end
end
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"deck"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
Buttons.sel=nil
end
end
function startGame(mode)
--rec=""
gamemode=mode
gotoScene("play")
end
function back()
local t=prevMenu[scene]
if type(t)=="string"then
gotoScene(t)
else
t()
end
end
function loadData()
userData:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userData:read(),"\r\n")
userData:close()
for i=1,#t do
local i=t[i]
if find(i,"=")then
local t=sub(i,1,find(i,"=")-1)
local v=sub(i,find(i,"=")+1)
if t=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then
v=toN(v)if not v or v<0 then v=0 end
stat[t]=v
end
end
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")
--t=love.math.compress(t,"zlib"):getString()
userData:open("w")
userData:write(t)
userData:close()
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")
userSetting:close()
for i=1,#t do
local i=t[i]
if find(i,"=")then
local t=sub(i,1,find(i,"=")-1)
local v=sub(i,find(i,"=")+1)
if t=="sfx"or t=="bgm"then
setting[t]=v=="true"
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="bgblock"then
setting.bgblock=v=="true"
elseif t=="keymap"then
v=string.splitS(v,"/")
for i=1,16 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
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
v=string.splitS(v,"/")
for i=1,9 do
virtualkey[i]=string.splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
end
elseif t=="virtualkeyAlpha"then
setting.virtualkeyAlpha=int(abs(toN(v)))
elseif t=="virtualkeyIcon"then
setting.virtualkeyIcon=v=="true"
elseif t=="virtualkeySwitch"then
setting.virtualkeySwitch=v=="true"
elseif t=="frameMul"then
v=min(max(toN(v)or 100,0),100)
setting.frameMul=v
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
setting[t]=v=="true"
end
end
end
end
function saveSetting()
local vk={}
for i=1,9 do
for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
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({
stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm),
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")
--t=love.math.compress(t,"zlib"):getString()
userSetting:open("w")
userSetting:write(t)
userSetting:close()
end