Compare commits

..

5 Commits
v0.6 ... v0.7.3

Author SHA1 Message Date
MrZ_26
7eea017c72 Alpha V0.7.3 2020-02-04 19:30:03 +08:00
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
31 changed files with 940 additions and 360 deletions

BIN
BGM/infinite.ogg Normal file

Binary file not shown.

BIN
SFX/fail.ogg Normal file

Binary file not shown.

BIN
SFX/win.ogg Normal file

Binary file not shown.

59
ai.lua
View File

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

View File

@@ -58,6 +58,25 @@ 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
@@ -219,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]
@@ -229,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
@@ -245,10 +264,10 @@ 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 end
elseif scene=="setting3"then elseif scene=="setting3"then
sel=nil x,y=convert(x,y)
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then if (x-b[1])^2+(y-b[2])^2<b[3]then
@@ -276,10 +295,10 @@ function love.touchreleased(id,x,y)
end end
elseif scene=="setting3"and sel then elseif scene=="setting3"and sel then
x,y=convert(x,y) x,y=convert(x,y)
dx,dy=dx*screenK,dy*screenK
if sel then if sel then
local b=virtualkey[sel] local b=virtualkey[sel]
b[1],b[2]=int(b[1]/snapLevelValue[snapLevel]+.5)*40,int(b[2]/snapLevelValue[snapLevel]+.5)*snapLevelValue[snapLevel] 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 end
@@ -320,7 +339,6 @@ 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 if i=="f12"then devMode=true end
end end
function love.keyreleased(i) function love.keyreleased(i)
@@ -397,6 +415,7 @@ function love.receiveData(id,data)
return nil return nil
end end
function love.draw() function love.draw()
gc.clear()
Pnt.BG[curBG]() Pnt.BG[curBG]()
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for n=1,#BGblock do for n=1,#BGblock do
@@ -416,32 +435,32 @@ function love.draw()
end end
if sceneSwaping then sceneSwaping.draw()end if sceneSwaping then sceneSwaping.draw()end
gc.setColor(0,0,0) if wh/ww>.5625 then
if screenM>0 then gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,-screenM) gc.rectangle("fill",0,0,1280,ww*.5625-wh)
gc.rectangle("fill",0,720,1280,screenM) gc.rectangle("fill",0,720,1280,wh-ww*.5625)
end--Draw black side elseif wh/ww<.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,wh*16/9-ww,720)
gc.rectangle("fill",1280,0,ww-wh*16/9,720)
end
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)
if devMode then if devMode then
gc.print(gcinfo(),0,680) gc.print(gcinfo(),0,680)
gc.print(freeRow and #freeRow or 0,0,660) gc.print(freeRow and #freeRow or 0,0,660)
end end
--if gcinfo()>500 then collectgarbage()end
end end
function love.resize(x,y) function love.resize(w,h)
screenK=1280/gc.getWidth() ww,wh=w,h
screenM=(gc.getHeight()*16/9-gc.getWidth())/2 screenK=h/w>=.5625 and w/1280 or h/720
gc.origin() xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
gc.scale(1/screenK,1/screenK) gc.replaceTransform(xOy)
gc.translate(0,screenM)
end end
function love.run() function love.run()
local frameT=Timer() local frameT=Timer()
local readyDrawFrame=0 local readyDrawFrame=0
tm.step() love.resize(gc.getWidth(),gc.getHeight())
love.resize(nil,gc.getHeight())
game.load()--System scene Launch game.load()--System scene Launch
math.randomseed(os.time()*626) math.randomseed(os.time()*626)
return function() return function()
@@ -461,7 +480,7 @@ function love.run()
love.draw() love.draw()
gc.present() gc.present()
end end
if not wd.hasFocus()then if not(wd.hasFocus()or keeprun)then
focus=false focus=false
ms.setVisible(true) ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end if bgmPlaying then bgm[bgmPlaying]:pause()end
@@ -476,6 +495,7 @@ function love.run()
else else
tm.sleep(.2) tm.sleep(.2)
if wd.hasFocus()then if wd.hasFocus()then
tm.step()
focus=true focus=true
ms.setVisible(false) ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end 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.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.3"
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

View File

@@ -1,15 +1,18 @@
function resetGameData() function resetGameData()
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]:release()end for k,v in pairs(PTC.dust)do
if k~=0 then v:release()end
end
for i=1,#players do for i=1,#players do
PTC.dust[i]=PTC.dust[0]:clone() if not players[i].small then
PTC.dust[i]:start() PTC.dust[i]=PTC.dust[0]:clone()
PTC.dust[i]:start()
end
end end
for i=1,#virtualkey do for i=1,#virtualkey do
virtualkey[i].press=false virtualkey[i].press=false
@@ -18,7 +21,7 @@ function resetGameData()
freeRow={} freeRow={}
collectgarbage() 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} freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end end
end end
@@ -42,7 +45,7 @@ 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,pc=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
@@ -67,19 +70,21 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock
P.freshTime=0 P.freshTime=0
P.lastSpin=false 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} P.freshNext=freshMethod[P.gameEnv.sequence]
for i=1,7 do
P.nxt[i]=rem(bag1,rnd(#bag1))
P.nb[i]=blocks[P.nxt[i]][0]
end--First bag
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
@@ -132,17 +137,17 @@ function throwBadge(s,r,amount)--Player id
ins(FX.badge,{x1,y1,x2,y2,t=0,size=(10+min(amount,10))*.1}) ins(FX.badge,{x1,y1,x2,y2,t=0,size=(10+min(amount,10))*.1})
end end
function freshgho() function freshgho()
if not P.gameEnv._20G then if P.gameEnv._20G or keyPressing[7]and gameEnv.sdarr==0 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
else
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()
@@ -168,9 +173,11 @@ function checkrow(s,num)--(cy,r)
ins(clearing,1,i) ins(clearing,1,i)
P.falling=gameEnv.fall P.falling=gameEnv.fall
c=c+1--row cleared+1 c=c+1--row cleared+1
for k=1,250 do if not P.small then
PTC.dust[P.id]:setPosition(rnd(300),600-30*i+rnd(30)) for k=1,250 do
PTC.dust[P.id]:emit(1) PTC.dust[P.id]:setPosition(rnd(300),600-30*i+rnd(30))
PTC.dust[P.id]:emit(1)
end
end end
end end end end
return c return c
@@ -221,7 +228,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
@@ -236,7 +243,7 @@ function spin(d,ifpre)
if bn==6 then if bn==6 then
freshgho()--May cancel spinLast freshgho()--May cancel spinLast
freshLockDelay() 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 if id==1 then
stat.rotate=stat.rotate+1 stat.rotate=stat.rotate+1
end end
@@ -296,9 +303,9 @@ function hold(ifpre)
end end
end end
function drop() function drop()
if cy==y_img then if P.cy==P.y_img then
ins(dropTime,1,frame)rem(dropTime,11)--update speed dial ins(P.dropTime,1,frame)rem(P.dropTime,11)--update speed dial
P.waiting=gameEnv.wait 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 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 if bn<6 and spinLast then
@@ -317,32 +324,33 @@ 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=bn~=7 and 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 P.combo=P.combo+1--combo=0 is under
if cc==4 then if cc==4 then
if b2b>480 then if b2b>480 then
showText("Tetris B2B2B","fly",70) showText("Techrash B2B2B","fly",70)
csend=6 csend=6
exblock=exblock+2 sendTime=80
elseif b2b>=100 then
showText("Tetris B2B","drive",70)
csend=5
exblock=exblock+1 exblock=exblock+1
elseif b2b>=30 then
showText("Techrash B2B","drive",70)
sendTime=70
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>480 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
elseif b2b>=100 then elseif b2b>=30 then
showText(spinName[cc][bn].." B2B","spin",40) showText(spinName[cc][bn].." B2B","spin",40)
csend=b2bATK[cc] csend=b2bATK[cc]
else else
@@ -352,17 +360,18 @@ function drop()
sendTime=20+csend*20 sendTime=20+csend*20
if mini then if mini then
showText("Mini","drive",40,10) showText("Mini","drive",40,10)
csend=ceil(csend*.5)
sendTime=sendTime+60 sendTime=sendTime+60
P.b2b=P.b2b+90+10*cc P.b2b=P.b2b+b2bPoint[cc]*.8
else else
P.b2b=P.b2b+70+30*cc P.b2b=P.b2b+b2bPoint[cc]
end end
SFX(spin_n[cc]) SFX(spin_n[cc])
if id==1 then if id==1 then
stat.spin=stat.spin+1 stat.spin=stat.spin+1
end end
elseif #clearing<#field then elseif #clearing<#field then
P.b2b=P.b2b-300 P.b2b=P.b2b-150-cc*50
showText(clearName[cc],"appear",50) showText(clearName[cc],"appear",50)
csend=cc-1 csend=cc-1
sendTime=20+csend*20 sendTime=20+csend*20
@@ -372,17 +381,20 @@ 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=P.b2b+15
end end
end end
if cc>0 and #clearing==#field then if cc>0 and #clearing==#field then
showText("Perfect Clear","flicker",70,-80) showText("Perfect Clear","flicker",70,-80)
csend=csend+5 csend=csend+min(6+P.cstat.pc,10)
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
P.cstat.pc=P.cstat.pc+1
end end
csend=csend+(renATK[combo]or 4) csend=csend+(renATK[combo]or 4)
@@ -403,8 +415,8 @@ function drop()
csend=int(csend) csend=int(csend)
--Buffs --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
@@ -423,22 +435,25 @@ function drop()
end end
end end
if csend>0 then if csend>0 then
showText(csend,"appear",30,50) showText(csend,"zoomout",25,70)
if #players.alive>1 then if #players.alive>1 then
garbageSend(P.id,csend,sendTime) garbageSend(P.id,csend,sendTime)
end end
end end
elseif cc==0 then elseif cc==0 then
if P.b2b>480 then
P.b2b=max(P.b2b-40,480)
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
P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc
if P.cstat.row>=gameEnv.target then if P.cstat.row>=gameEnv.target then
gameEnv.reach() gameEnv.reach()
if control then SFX("reach")end
end end
P.spinLast=dospin and cc>0
else else
P.cy=cy-1 P.cy=cy-1
P.spinLast=false P.spinLast=false
@@ -463,9 +478,11 @@ function garbageSend(sender,send,time)
r=players.alive[rnd(#players.alive)] r=players.alive[rnd(#players.alive)]
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})
players[r].lastRecv=sender players[r].lastRecv=sender
sort(players[r].atkBuffer,timeSort) if #players[r].atkBuffer<20 then
ins(players[r].atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false,lv=level})
sort(players[r].atkBuffer,timeSort)
end
end end
function garbageRelease() function garbageRelease()
local t=P.showTime*2 local t=P.showTime*2

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

233
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={ color={
red={1,0,0}, red={1,0,0},
green={0,1,0}, green={0,1,0},
@@ -73,7 +102,7 @@ end
sfx={ sfx={
"button", "button",
"ready","start", "ready","start","win","fail",
"move","rotate","rotatekick","hold", "move","rotate","rotatekick","hold",
"prerotate","prehold", "prerotate","prehold",
"drop","fall", "drop","fall",
@@ -89,13 +118,17 @@ bgm={
"race", "race",
"push", "push",
"reason", "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=function() setting=function()
@@ -108,28 +141,85 @@ prevMenu={
main="quit", main="quit",
} }
modeID={"sprint","marathon","zen","solo","death","blind","tetris41","asymsolo","gmroll","p2","p3","p4"} modeID={"sprint","marathon","zen","infinite","solo","death","tsd","blind","pc","techmino41","techmino99","gmroll","p2","p3","p4"}
modeName={"Sprint","Marathon","Zen","1v1","Death","Blind","Tetris 41","Asymmetry solo","GM roll","2P","3P","4P"} modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","TSD-only","Blind","PC Puzzle","Techmino41","Techmino99","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",
tsd="T-spin-double Only!",
blind="Invisible board!", blind="Invisible board!",
tetris41="Melee fight with 40 AIs", pc="Make as much PCs as you can",
asymsolo=" See-->", techmino41="Melee fight with 40 AIs",
techmino99="Melee fight with 98 AIs",
gmroll="Who want to be the grand master?", gmroll="Who want to be the grand master?",
p2="2 players game", p2="2 players game",
p3="3 players game", p3="3 players game",
p4="4 players game", p4="4 players game",
} }
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={10,20,40,100,200,500,1000,""},
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,1e99},
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={"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:"} 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",}
b2bPoint={50,90,150}
b2bATK={3,5,8} b2bATK={3,5,8}
spin_n={"spin_1","spin_2","spin_3"} spin_n={"spin_1","spin_2","spin_3"}
@@ -138,11 +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%",} 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}
snapLevelValue={1,10,20,40,80} 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"} 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)
@@ -177,7 +270,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,
@@ -190,10 +286,34 @@ act={
count=60+26--Althour'z neim count=60+26--Althour'z neim
end, end,
insDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false 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, insLeft=function()
insRight=function()while not ifoverlap(cb,cx+1,cy)do P.cx,P.lockDelay=cx+1,gameEnv.lock;freshgho()end end, while not ifoverlap(cb,cx-1,cy)do
down1=function()if cy~=y_img then P.cy=cy-1 end end, P.cx,P.lockDelay=cx-1,gameEnv.lock
down4=function()for i=1,4 do if cy~=y_img then P.cy=cy-1 else break end 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
} }
@@ -219,38 +339,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},{0,2},{1,2},{-1,-1}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [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}}, [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}},
@@ -262,8 +382,8 @@ TRS={
[01]={{0,0},{1,0},{-2,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},{-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},{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},{2,-1},{-1,2}}, [03]={{0,0},{-1,0},{2,0},{2,-1},{-1,2}},
@@ -282,13 +402,22 @@ 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",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={
}, },
@@ -322,7 +451,7 @@ Buttons={
code=function() code=function()
setting.bgblock=not setting.bgblock setting.bgblock=not setting.bgblock
if not setting.bgblock then if not setting.bgblock then
for i=1,116 do for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v BGblockList[i].v=3*BGblockList[i].v
end end
end end
@@ -337,14 +466,14 @@ Buttons={
end,up=14,down=16}, 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=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=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=function()back()end,up=17}, {x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=back,up=17},
--15~18 --15~18
}, },
setting2={--Control setting setting2={--Control setting
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end}, {x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
setting3={--Touch setting setting3={--Touch setting
{x=640,y=410,w=170,h=80,t="Back",code=function()back()end}, {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() {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},
@@ -355,7 +484,7 @@ Buttons={
end--Reset virtualkey end--Reset virtualkey
end}, end},
{x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function() {x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function()
snapLevel=snapLevel%5+1 snapLevel=snapLevel%6+1
end}, end},
{x=830,y=310,w=170,h=80,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
@@ -375,11 +504,11 @@ Buttons={
end}, end},
}, },
help={ help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end,right=2}, {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}, {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)
} }
@@ -422,7 +551,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",
"", "",
@@ -430,7 +559,7 @@ Text={
"Author:MrZ E-mail:1046101471@qq.com", "Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ", "Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave", "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.", "Any bugs/suggestions to my E-mail.",
}, },
} }

368
main.lua
View File

@@ -1,12 +1,24 @@
gc,kb,ms,tc,tm,fs,wd,sys=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window,love.system 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 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
xOy=love.math.newTransform()
focus=true focus=true
system=sys.getOS() system=sys.getOS()
@@ -28,7 +40,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
@@ -41,11 +53,11 @@ gameEnv0={
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,
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
@@ -57,31 +69,39 @@ 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,
--not all is actually used,some only provide a key --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() function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #P.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(P.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
end end
for i=6,#P.nxt do
P.nb[i]=blocks[P.nxt[i]][0]
end
end, end,
function() function()
P.bn,P.cb=rem(P.nxt,1),rem(P.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) repeat
for k=1,4 do i,j=rnd(7),j+1
if i==P.his[k]then f=true end until not(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])
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(P.his,1)ins(P.his,i) rem(P.his,1)ins(P.his,i)
end, end,
@@ -90,12 +110,46 @@ randomMethod={
repeat i=rnd(7)until i~=P.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,
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}
repeat
local i=rem(bag,rnd(#bag))
ins(P.nxt,i)
ins(P.nb,blocks[i][0])
until #bag==0
bag={1,2,3,4,5,6,7,5}
repeat
local i=rem(bag,rnd(#bag))
ins(P.nxt,i)
ins(P.nb,blocks[i][0])
until #bag==0
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={ 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,
} }
@@ -107,14 +161,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={
@@ -134,7 +195,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,
@@ -160,24 +220,86 @@ loadmode={
curBG="game2" curBG="game2"
BGM("push") BGM("push")
end, end,
tetris41=function() tsd=function()
modeEnv={ modeEnv={
wait=1, drop=60,
fall=1, 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},
} }
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,1+rnd(14)) createPlayer(n,75*i-48,142*j-130,.19,rnd(15))
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,1+rnd(14)) 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 n=n+1
end end
end--AIs end--AIs
@@ -187,8 +309,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
@@ -201,8 +321,6 @@ loadmode={
modeEnv={ modeEnv={
drop=15, drop=15,
lock=30, lock=30,
wait=1,
fall=1,
visible=0, visible=0,
freshLimit=10, freshLimit=10,
} }
@@ -211,23 +329,8 @@ loadmode={
curBG="glow" curBG="glow"
BGM("push") BGM("push")
end, end,
asymsolo=function()
modeEnv={
wait=1,
fall=1,
visible=2,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI
curBG="game2"
BGM("race")
end,
p2=function() p2=function()
modeEnv={ modeEnv={
wait=1,
fall=30,
freshLimit=15, freshLimit=15,
} }
createPlayer(1,20,15) createPlayer(1,20,15)
@@ -238,8 +341,6 @@ loadmode={
end, end,
p3=function() p3=function()
modeEnv={ modeEnv={
wait=1,
fall=30,
freshLimit=15, freshLimit=15,
} }
createPlayer(1,20,100,.65) createPlayer(1,20,100,.65)
@@ -251,8 +352,6 @@ loadmode={
end, end,
p4=function() p4=function()
modeEnv={ modeEnv={
wait=1,
fall=30,
freshLimit=15, freshLimit=15,
} }
createPlayer(1,25,150,.5) createPlayer(1,25,150,.5)
@@ -263,6 +362,23 @@ loadmode={
curBG="game2" curBG="game2"
BGM("way") BGM("way")
end, 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={
@@ -279,6 +395,7 @@ Event={
end end
end end
showText("WIN","appear",100,nil,true) 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()
@@ -289,10 +406,13 @@ Event={
P.waiting=1e99 P.waiting=1e99
P.b2b=0 P.b2b=0
showText("LOSE","appear",100,nil,true) showText("LOSE","appear",100,nil,true)
if royaleMode and P.lastRecv then if modeEnv.royaleMode and P.lastRecv then
throwBadge(P.id,P.lastRecv,P.badge) throwBadge(P.id,P.lastRecv,P.badge)
players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1 players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1
players[P.lastRecv].strength=min(int(players[P.lastRecv].badge*.2),4) 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 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
@@ -312,17 +432,19 @@ Event={
visTime[i][j]=min(visTime[i][j],20) visTime[i][j]=min(visTime[i][j],20)
end end
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,
}, },
marathon_reach=function() marathon_reach=function()
local s=int(P.cstat.row*.1) local s=int(cstat.row*.1)
if s>=20 then if s>=20 then
Event.gameover.win() Event.gameover.win()
else else
gameEnv.drop=marathon_drop[s] gameEnv.drop=marathon_drop[s]
if s==18 then gameEnv._20G=true end if s==18 then gameEnv._20G=true end
gameEnv.target=s*10+10 gameEnv.target=s*10+10
SFX("reach")
end end
end, end,
death_reach=function() death_reach=function()
@@ -338,6 +460,33 @@ Event={
SFX("reach") SFX("reach")
end end
end, end,
tsd_reach=function()
if not(#clearing==2 and bn==5 and P.spinLast)then
Event.gameover.lose()
else
P.gameEnv.target=P.gameEnv.target+2
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
else
Event.gameover.lose()
end
end,
task={ task={
winTrigger=function() winTrigger=function()
Event.gameover.win() Event.gameover.win()
@@ -381,6 +530,30 @@ Event={
end end
end 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={ mesDisp={
@@ -393,52 +566,84 @@ 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,
solo=function()
setFont(50)
mStr(cstat.atk,-75,320)
setFont(20)
gc.print("Attack",-100,360)
end,
gmroll=function() gmroll=function()
setFont(35) setFont(25)
gc.print("Tetris",-120,390) gc.print("Techrash",-120,420)
setFont(80) setFont(80)
mStr(cstat.tetris,-75,420) mStr(cstat.techrash,-75,350)
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() tsd=function()
setFont(35)
gc.print("TSD",-105,405)
setFont(80)
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) gc.draw(badgeIcon,-120,150,nil,1.5)
setFont(50) setFont(50)
gc.print(badge,-65,150) gc.print(badge,-65,150)
mStr(cstat.atk,-75,320) mStr(cstat.atk,-75,320)
mStr(#players.alive,-75,430) mStr(#players.alive,-75,430)
setFont(20) setFont(20)
gc.print("Attack",-103,360) 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) gc.print("Remain",-105,472)
end, end,
blind=function() blind=function()
setFont(35) setFont(25)
gc.print("Rows",-115,220) gc.print("Rows",-100,300)
gc.print("Tetris",-120,390) gc.print("Techrash",-120,420)
setFont(80) setFont(80)
mStr(P.cstat.row,-75,250) mStr(P.cstat.row,-75,230)
mStr(cstat.tetris,-75,420) mStr(cstat.techrash,-75,350)
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)
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
@@ -503,16 +708,15 @@ 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 Plyr[n] when chng any playr's val!
require("toolfunc")
require("gamefunc")
require("list") require("list")
require("texture") require("texture")
require("ai") require("ai")
require("toolfunc")
require("sysfunc")
require("gamefunc")
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")

198
paint.lua
View File

@@ -81,6 +81,16 @@ FX={
gc.setColor(1,1,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()
@@ -147,39 +157,51 @@ function drawVirtualkey(s)
end end
end end
Pnt={BG={}} Pnt={}
function Pnt.BG.none() Pnt.BG={
gc.clear(.2,.2,.2) none=function()
end gc.clear(.2,.2,.2)
function Pnt.BG.glow() end,
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 glow=function()
gc.clear(t,t,t) local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
end gc.clear(t,t,t)
function Pnt.BG.game1() end,
gc.setColor(1,1,1) game1=function()
gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64) gc.setColor(1,1,1)
end gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64)
function Pnt.BG.game2() end,
gc.setColor(1,.5,.5) game2=function()
gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64) gc.setColor(1,.5,.5)
end gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64)
function Pnt.BG.game3() end,
gc.setColor(.6,.6,1) game3=function()
gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64) gc.setColor(.6,.6,1)
end gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64)
function Pnt.BG.rgb() end,
gc.clear( rgb=function()
sin(Timer()*1.2)*.15+.5, gc.clear(
sin(Timer()*1.5)*.15+.5, sin(Timer()*1.2)*.15+.5,
sin(Timer()*1.9)*.15+.5 sin(Timer()*1.5)*.15+.5,
) sin(Timer()*1.9)*.15+.5
end )
function Pnt.BG.strap() end,
gc.setColor(1,1,1) strap=function()
local x=Timer()%32*40 gc.setColor(1,1,1)
gc.draw(background[2],x,0,nil,10) local x=Timer()%32*40
gc.draw(background[2],x-1280,0,nil,10) gc.draw(background[2],x,0,nil,10)
end gc.draw(background[2],x-1280,0,nil,10)
end,
matrix=function()
for i=0,15 do
for j=0,8 do
-- local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3
local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2
gc.setColor(t,t,t)
gc.rectangle("fill",80*i,80*j,80,80)
end
end
end,
}
function Pnt.load() function Pnt.load()
gc.setLineWidth(4) gc.setLineWidth(4)
@@ -188,30 +210,21 @@ 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.6",370,150) gc.print("Alpha V0.7.3",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) gc.setColor(color.white)
mStr(modeInfo[modeID[modeSel]],270,305)
setFont(80) setFont(80)
gc.setColor(color.grey) gc.setColor(color.grey)
mStr(modeName[modeSel],643,283) mStr(modeName[modeSel],643,283)
@@ -224,6 +237,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(40)
for i=1,#customID do
local k=customID[i]
local y=90+40*i
gc.print(customOption[k],50,y)
if customVal[k]then
gc.print(customVal[k][customSel[k]],350,y)
else
gc.print(customRange[k][customSel[k]],350,y)
end
end
gc.print("",10,90+40*optSel)
end
function Pnt.play() function Pnt.play()
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
@@ -236,37 +268,15 @@ function Pnt.play()
gc.stencil(stencil_field_small, "replace",1) gc.stencil(stencil_field_small, "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=int(fieldBeneath/30+1),#field do
if falling<=0 or without(clearing,j)then if falling<=0 or without(clearing,j)then
for i=1,10 do for i=1,10 do
if field[j][i]>0 then if field[j][i]>0 then
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 not P.result then
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(1,1,1)
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
end
gc.setColor(1,1,1)
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(frameColor[P.strength])gc.rectangle("line",-7,-7,314,614)--Draw boarder gc.setColor(frameColor[P.strength])gc.rectangle("line",-7,-7,314,614)--Draw boarder
@@ -275,31 +285,6 @@ function Pnt.play()
gc.setColor(1,1,1,min(P.counter,60)*.01) gc.setColor(1,1,1,min(P.counter,60)*.01)
setFont(100) setFont(100)
mStr(P.result,150,250) mStr(P.result,150,250)
else
local h=0
for i=1,#atkBuffer do
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",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
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,-b2b)
--B2B bar
end end
gc.pop() gc.pop()
else else
@@ -312,7 +297,7 @@ function Pnt.play()
gc.stencil(stencil_field, "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=int(fieldBeneath/30+1),#field do
if falling<=0 or without(clearing,j)then if falling<=0 or without(clearing,j)then
for i=1,10 do for i=1,10 do
if field[j][i]>0 then if field[j][i]>0 then
@@ -360,6 +345,7 @@ function Pnt.play()
for i=1,#atkBuffer do for i=1,#atkBuffer do
local a=atkBuffer[i] local a=atkBuffer[i]
local bar=a.amount*30 local bar=a.amount*30
if h+bar>600 then bar=600-h end
if not a.sent then if not a.sent then
if a.time<20 then if a.time<20 then
bar=bar*(20*a.time)^.5*.05 bar=bar*(20*a.time)^.5*.05
@@ -367,31 +353,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+3)
--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<40 and color.white or b2b<=480 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("fill",-20,600-100,16,5) gc.rectangle("fill",-23,600-40,16,5)
gc.setColor(color.blue) gc.setColor(color.blue)
gc.rectangle("fill",-20,600-480,16,5) gc.rectangle("fill",-23,600-480,16,5)
--B2B bar --B2B bar
setFont(40) setFont(40)
@@ -407,7 +393,7 @@ function Pnt.play()
end end
end--Hold end--Hold
gc.print("Next",336,0) gc.print("Next",336,0)
for N=1,gameEnv.next do for N=1,min(gameEnv.next,#nxt)do
local b=nb[N] local b=nb[N]
for i=1,#b do for i=1,#b do
for j=1,#b[1] do for j=1,#b[1] do
@@ -432,7 +418,7 @@ function Pnt.play()
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)

View File

@@ -2,17 +2,15 @@ game={}
function game.load() function game.load()
scene="load" scene="load"
curBG="none" curBG="none"
keeprun=true
loading=1--Loading mode loading=1--Loading mode
loadnum=1--Loading counter loadnum=1--Loading counter
loadprogress=0--Loading bar loadprogress=0--Loading bar
end end
function game.intro()
scene="intro"
curBG="none"
end
function game.main() function game.main()
scene="main" scene="main"
curBG="none" curBG="none"
keeprun=false
BGM("blank") BGM("blank")
collectgarbage() collectgarbage()
end end
@@ -23,6 +21,12 @@ function game.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"

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

View File

@@ -1,16 +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") 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={
@@ -24,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)

View File

@@ -106,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
@@ -163,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
@@ -188,9 +190,8 @@ function Tmr.play(dt)
end end
end end
end end
P.b2b1=P.b2b1*.93+P.b2b*.07 P.b2b1=P.b2b1*.92+P.b2b*.08
if P.b2b>480 then P.b2b=P.b2b-1 end --Alive
--ALive
else 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
@@ -241,7 +242,9 @@ 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
PTC.dust[p]:update(dt) if not P.small then
PTC.dust[p]:update(dt)
end
end end
setmetatable(_G,nil) setmetatable(_G,nil)
end end

View File

@@ -15,9 +15,11 @@ function without(t,v)
end end
return true return true
end 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) function convert(x,y)
return x*screenK,(y-screenM)*screenK return xOy:inverseTransformPoint(x,y)
end end
function getNewRow(val) function getNewRow(val)
@@ -63,4 +65,204 @@ end
function stencil_field_small() function stencil_field_small()
gc.rectangle("fill",0,0,300,600) gc.rectangle("fill",0,0,300,600)
end end
--Single use --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