Compare commits

...

4 Commits
v0.5 ... v0.7.1

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

BIN
BGM/infinite.ogg Normal file

Binary file not shown.

View File

@@ -1,14 +0,0 @@
local count=0
BGblockList={}for i=1,16 do BGblockList[i]={}end
function getNewBlock()
count=count+1
if count==17 then count=1 end
local t=BGblockList[count]
t.bn,t.size=rnd(7),2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
return t
end

BIN
SFX/fail.ogg Normal file

Binary file not shown.

BIN
SFX/win.ogg Normal file

Binary file not shown.

10
ai.lua
View File

@@ -5,7 +5,7 @@ VerticalTransitions
BlockedCells
Wells
FilledLines
TetrisShape
TechrashShape
BlockedWells;
]]
dirCount={1,1,3,3,3,0,1}
@@ -97,17 +97,17 @@ function getScore(field,cb,cx,cy)
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)
end
end
ins(freeRow,height)
return
-highest*5
-rough*15
-rough*20
-cy*20
-#cb*10
+clear^2*4
-hole*15
-hole*25
end
function AI_getControls(ctrl)
local Tfield={}--test field
@@ -119,7 +119,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]

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,8 @@ 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 +348,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 +357,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 +384,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,6 +409,9 @@ function love.update(dt)
end
--scene swapping & Timer
end
function love.sendData(data)
return nil
end
function love.receiveData(id,data)
return nil
end
@@ -355,7 +443,10 @@ function love.draw()
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)
@@ -371,7 +462,7 @@ function love.run()
tm.step()
love.resize(nil,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
@@ -402,7 +493,7 @@ function love.run()
end
end
else
tm.sleep(.1)
tm.sleep(.2)
if wd.hasFocus()then
focus=true
ms.setVisible(false)

BIN
cb.ttf

Binary file not shown.

View File

@@ -5,11 +5,11 @@ function love.conf(t)
t.version="11.1"
t.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.1"
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,12 @@
function resetGameData()
if players then restockRow()end--Avoid first start game error
players={alive={}}
royaleMode=false
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()
@@ -42,10 +42,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}--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,7 +62,6 @@ 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
@@ -72,12 +74,13 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.nb[i]=blocks[P.nxt[i]][0]
end--First bag
P.freshNext=randomMethod[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
@@ -296,27 +318,29 @@ 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~=7 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)
if b2b>500 then
showText("Techrash B2B2B","fly",70)
csend=6
sendTime=80
exblock=exblock+1
elseif b2b>=100 then
showText("Tetris B2B","drive",70)
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
if b2b>500 then
showText(spinName[cc][bn].." B2B2B","spin",40)
csend=b2bATK[cc]+1
exblock=exblock+1
@@ -350,7 +374,7 @@ function drop()
if dospin then
showText(spinName[0][bn],"appear",50)
SFX("spin_0")
P.b2b=b2b+40
P.b2b=b2b+30
end
end
@@ -360,7 +384,9 @@ function drop()
exblock=exblock+2
sendTime=sendTime+30
SFX("perfectclear")
P.b2b=b2b+150
if cstat.piece>10 then
P.b2b=600
end
end
csend=csend+(renATK[combo]or 4)
@@ -375,11 +401,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,10 +426,20 @@ 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>450 then
P.b2b=b2b-10
elseif P.b2b>100 then
P.b2b=max(b2b-6,100)
end
garbageRelease()
end--Send attack
end
if id==1 then
stat.piece,stat.row=stat.piece+1,stat.row+cc
end
@@ -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

349
list.lua
View File

@@ -15,9 +15,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 +42,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,36 +71,121 @@ 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","blind","puzzle","techmino41","asymsolo","gmroll","p2","p3","p4"}
modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Techmino 41","Asymmetry solo","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",
blind="Invisible board!",
tetris41="Melee fight with 40 AIs",
puzzle="Your keyboard broke",
techmino41="Melee fight with 40 AIs",
asymsolo=" See-->",
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",}
@@ -98,9 +197,11 @@ ren_n={"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","
percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
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}
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 +236,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 +251,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 +305,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},{-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,1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,-1},{1,-1},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}},
[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 +345,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 +368,42 @@ Buttons={
{x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3},
{x=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 +411,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 +470,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 +483,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 +517,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",
"",

356
main.lua
View File

@@ -1,22 +1,23 @@
gc,kb,ms,tc,tm,fs,wd=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window
gc,kb,ms,tc,tm,fs,wd,sys=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window,love.system
toN,toS=tonumber,tostring
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
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 +29,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 +37,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 +58,54 @@ 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
}
customSel={
drop=20,
lock=20,
wait=1,
fall=1,
next=7,
hold=1,
sequence=1,
visible=1,
target=4,
freshLimit=3,
opponent=1,
}
randomMethod={
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)))
end
end
for i=6,#nxt do
nb[i]=blocks[nxt[i]][0]
for i=6,#P.nxt do
P.nb[i]=blocks[P.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,
}
loadmode={
sprint=function()
modeEnv={
wait=1,
fall=1,
drop=60,
target=40,
reach=Event.gameover.win,
}
@@ -131,14 +117,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 +151,6 @@ loadmode={
marathon=function()
modeEnv={
drop=60,
wait=1,
fall=20,
target=10,
reach=Event.marathon_reach,
@@ -184,23 +176,39 @@ loadmode={
curBG="game2"
BGM("push")
end,
tetris41=function()
puzzle=function()
modeEnv={
wait=1,
fall=1,
hold=false,
das=0,
arr=0,
_20G=true,
drop=0,
lock=1e99,
fall=10,
target=40,
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="glow"
BGM("way")
end,
techmino41=function()
modeEnv={
freshLimit=15,
}
royaleMode=true
createPlayer(1,340,15)--Player
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,1+rnd(14))
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,1+rnd(14))
n=n+1
end
end--AIs
@@ -210,8 +218,6 @@ loadmode={
end,
solo=function()
modeEnv={
wait=1,
fall=1,
freshLimit=15,
}
createPlayer(1,20,15)--Player
@@ -224,8 +230,6 @@ loadmode={
modeEnv={
drop=15,
lock=30,
wait=1,
fall=1,
visible=0,
freshLimit=10,
}
@@ -236,8 +240,6 @@ loadmode={
end,
asymsolo=function()
modeEnv={
wait=1,
fall=1,
visible=2,
freshLimit=15,
}
@@ -247,6 +249,56 @@ loadmode={
curBG="game2"
BGM("race")
end,
p2=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,15)
createPlayer(2,650,15)
curBG="game2"
BGM("way")
end,
p3=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,100,.65)
createPlayer(2,435,100,.65)
createPlayer(3,850,100,.65)
curBG="game2"
BGM("way")
end,
p4=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,25,150,.5)
createPlayer(2,335,150,.5)
createPlayer(3,645,150,.5)
createPlayer(4,955,150,.5)
curBG="game2"
BGM("way")
end,
custom=function()
modeEnv={reach=Event.gameover.win}
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[k]]
end
modeEnv._20G=modeEnv.drop==-1
if modeEnv.opponent==0 then
createPlayer(1,340,15)
else
modeEnv.target=nil
createPlayer(1,20,15)
createPlayer(2,660,85,.9,modeEnv.opponent)
end
curBG="matrix"
BGM("reason")
end,
}
Event={
gameover={
@@ -255,21 +307,36 @@ 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 royaleMode and P.lastRecv then
throwBadge(P.id,P.lastRecv,P.badge)
players[P.lastRecv].badge=players[P.lastRecv].badge+P.badge+1
players[P.lastRecv].strength=min(int(players[P.lastRecv].badge*.2),4)
end
for i=1,#players.alive do
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,6 +344,12 @@ 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,
},
@@ -304,30 +377,44 @@ Event={
end
end,
task={
winTrigger=function()
Event.gameover.win()
return true
end,
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
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
if j==#field then gameover=50 end
end
end
if gameover>80 then
return true
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
@@ -344,61 +431,105 @@ 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,
gmroll=function()
setFont(35)
gc.print("Tetris",-120,390)
setFont(30)
gc.print("Techrash",-130,390)
setFont(80)
mStr(cstat.tetris,-75,420)
mStr(cstat.techrash,-75,420)
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)
setFont(80)
mStr(#players.alive,-75,380)
mStr(cstat.atk,-75,240)
puzzle=function()
setFont(75)
mStr(max(40-P.cstat.row,0),-75,280)
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,
blind=function()
setFont(35)
gc.print("Rows",-115,220)
gc.print("Tetris",-120,390)
setFont(30)
gc.print("Rows",-110,220)
gc.print("Techrash",-130,390)
setFont(80)
mStr(P.cstat.row,-75,250)
mStr(cstat.tetris,-75,420)
mStr(cstat.techrash,-75,420)
end,
solo=function()
gc.print("Attack",-130,365)
gc.print("Attack",-128,365)
setFont(80)
mStr(cstat.atk,-75,300)
end,
asymsolo=function()
gc.print("Attack",-132,365)
gc.print("Attack",-128,365)
setFont(80)
mStr(cstat.atk,-75,300)
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 +559,20 @@ stat={
spin=0,
}
--User Data&User Setting
--------------------------------Warning!_G is __indexed to players[n] when changing any player's data!
require("list")
require("texture")
require("BGblock")
require("ai")
--------------------------------Wrning!_G __index Ply[n] when chng any playr's elments!
require("toolfunc")
require("sysfunc")
require("gamefunc")
require("list")
require("texture")
require("ai")
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

281
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,15 @@ 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
gc.setColor(t,t,t)
gc.rectangle("fill",80*i,80*j,80,80)
end
end
end
function Pnt.load()
gc.setLineWidth(4)
@@ -177,28 +207,18 @@ 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.1",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)
setFont(80)
@@ -213,6 +233,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 +260,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 +271,51 @@ 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
if P.result then
gc.setColor(1,1,1,min(P.counter,60)*.01)
setFont(100)
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",315,600-h,8,-bar+5)
gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",315,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing
else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",315,600-h,8,-bar+5)
--Warning
end
end
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
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
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
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 +362,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 +375,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<100 and color.white or b2b<=500 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-100,16,5)
gc.setColor(color.blue)
gc.rectangle("line",-20,600-480,15,2)
gc.rectangle("fill",-23,600-500,16,5)
--B2B bar
setFont(40)
@@ -423,13 +435,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 +458,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

@@ -19,11 +19,16 @@ 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 +40,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,12 @@ function Tmr.play(dt)
end
end
end
if P.b2b>480 then P.b2b=P.b2b-1 end
else--Alive
P.b2b1=P.b2b1*.93+P.b2b*.07
if P.b2b>500 then
P.b2b=P.b2b-.06
end
--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 +210,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 +245,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
@@ -39,14 +38,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 +60,7 @@ end
function stencil_field()
gc.rectangle("fill",0,-10,300,610)
end
function stencil_field_small()
gc.rectangle("fill",0,0,300,600)
end
--Single use