Compare commits

...

1 Commits

Author SHA1 Message Date
MrZ_26
f82e979f9c Alpha V0.7.14 2020-02-04 19:33:20 +08:00
14 changed files with 470 additions and 215 deletions

8
ai.lua
View File

@@ -60,7 +60,7 @@ function resetField(f0,f,start)
goto L
end
for i=start,#f0 do
f[i]=getNewRow()
f[i]=getNewRow(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
@@ -69,7 +69,7 @@ end
function getScore(field,bn,cb,cx,cy)
local score=0
local highest=0
local height=getNewRow()
local height=getNewRow(0)
local clear=0
local hole=0
@@ -124,7 +124,7 @@ function AI_getControls(ctrl)
local Tfield={}--test field
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getNewRow()
Tfield[i]=getNewRow(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
@@ -142,7 +142,7 @@ function AI_getControls(ctrl)
end--move to bottom
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow()end
if not Tfield[y]then Tfield[y]=getNewRow(0)end
for j=1,#cb[1]do
if cb[i][j]then
Tfield[y][cx+j-1]=1

View File

@@ -1,16 +1,15 @@
local gc=love.graphics
local tm=love.timer
local ms=love.mouse
local tc=love.touch
local gc,tm=love.graphics,love.timer
local ms,kb,tc=love.mouse,love.keyboard,love.touch
local wd=love.window
local setFont=setFont
local Timer=tm.getTime
local ww,wh=gc.getWidth(),gc.getHeight()
local scr=scr
local xOy=love.math.newTransform()
local focus=true
local mx,my,mouseShow=-20,-20,false
local touching=nil--1st touching ID
local sceneInit={
load=function()
curBG="none"
@@ -41,6 +40,14 @@ local sceneInit={
curBG="matrix"
keeprun=true
end,
draw=function()
kb.setKeyRepeat(true)
clearSureTime=0
pen=1
sx,sy=1,1
curBG="none"
keeprun=true
end,
play=function()
keeprun=false
resetGameData()
@@ -78,6 +85,7 @@ local sceneInit={
love.event.quit()
end,
}
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
local BGblock={tm=150,next=7,ct=0}
local function getNewBlock()
@@ -92,10 +100,9 @@ local function getNewBlock()
BGblock.next=BGblock.next%7+1
return t
end
local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}}
local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end
function onVirtualkey(x,y)
local x,y=xOy:inverseTransformPoint(x,y)
local d2,nearest,distance
for K=1,#virtualkey do
local b=virtualkey[K]
@@ -150,11 +157,122 @@ function mouseDown.intro(x,y,k)
gotoScene("main")
end
end
function mouseDown.draw(x,y,k)
mouseMove.draw(x,y)
return sx and sy
end
function mouseDown.setting3(x,y,k)
if k==2 then back()end
x,y=xOy:inverseTransformPoint(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
mouseMove={}
function mouseMove.draw(x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy and ms.isDown(1,2)then
preField[sy][sx]=ms.isDown(1)and pen or 0
end
end
function mouseMove.setting3(x,y,dx,dy)
x,y=xOy:inverseTransformPoint(x,y)
dx,dy=dx*scr.k,dy*scr.k
if sel and ms.isDown(1)then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
mouseUp={}
function mouseUp.setting3(x,y,k)
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
wheelmoved={}
function wheelmoved.draw(x,y)
if y<0 then
pen=pen+1
if pen==8 then pen=9 elseif pen==14 then pen=0 end
else
pen=pen-1
if pen==8 then pen=7 elseif pen==-1 then pen=13 end
end
end
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
touchDown={}
function touchDown.intro(id,x,y)
gotoScene("main")
end
function touchDown.draw(id,x,y)
end
function touchDown.setting3(id,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
function touchDown.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
end
touchUp={}
function touchUp.setting3(id,x,y)
if sel then
x,y=xOy:inverseTransformPoint(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 touchUp.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t,players[1])
end
end
end
touchMove={}
function touchMove.setting3(id,x,y)
dx,dy=dx*scr.k,dy*scr.k
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
function touchMove.play(id,x,y)
if setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
end
end
keyDown={}
function keyDown.intro(key)
if key=="escape"then
@@ -201,12 +319,40 @@ function keyDown.custom(key)
optSel=optSel%#customID+1
elseif key=="up"then
optSel=(optSel-2)%#customID+1
elseif key=="d"then
gotoScene("draw")
elseif key=="return"then
loadGame(0,1)
elseif key=="escape"then
back()
end
end
function keyDown.draw(key)
if key=="delete"then
Buttons.draw.clear.code()
elseif key=="up"or key=="down"or key=="left"or key=="right"then
if not sx then sx=1 end
if not sy then sy=1 end
if key=="up"and sy<20 then sy=sy+1
elseif key=="down"and sy>1 then sy=sy-1
elseif key=="left"and sx>1 then sx=sx-1
elseif key=="right"and sx<10 then sx=sx+1
end
if kb.isDown("space")then
preField[sy][sx]=pen
end
elseif key=="space"then
if sx and sy then
preField[sy][sx]=pen
end
elseif key=="backspace"then
pen=0
elseif key=="escape"then
back()
else
pen=find("123qwea#sdzxc",key)or pen
end
end
function keyDown.setting2(key)
if key=="escape"then
if keyboardSetting then
@@ -237,7 +383,7 @@ function keyDown.setting2(key)
end
end
function keyDown.play(key)
if key=="escape"then back()return end
if key=="escape"then back()end
local m=setting.keyMap
for p=1,human do
local lib=setting.keyLib[p]
@@ -346,12 +492,34 @@ function gamepadUp.play(key)
end
function love.mousepressed(x,y,k,t,num)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
elseif k==2 then
back()
end
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y,0,0)
sysSFX("button")
end
end
end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
if mouseMove[scene]then
mouseMove[scene](mx,my,dx,dy)
end
for N,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
@@ -361,28 +529,12 @@ function love.mousemoved(x,y,dx,dy,t)
end
end
end
function love.mousepressed(x,y,k,t,num)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
else
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==2 then
back()
end
end
end
function love.mousereleased(x,y,k,t,num)
if t then return end
mx,my=xOy:inverseTransformPoint(x,y)
if mouseUp[scene]then
mouseUp[scene](mx,my,k)
end
end
function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end
@@ -394,23 +546,8 @@ function love.touchpressed(id,x,y)
love.mousemoved(x,y)
mouseShow=false
end
if scene=="play"then
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(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
elseif scene=="intro"then
gotoScene("main")
if touchDown[scene]then
touchDown[scene](id,xOy:inverseTransformPoint(x,y))
end
end
function love.touchreleased(id,x,y)
@@ -426,18 +563,9 @@ function love.touchreleased(id,x,y)
Buttons.sel=nil
mouseShow=false
end
if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t,players[1])
end
elseif scene=="setting3"and sel then
x,y=xOy:inverseTransformPoint(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
if touchUp[scene]then
x,y=
touchUp[scene](id,xOy:inverseTransformPoint(x,y))
end
end
function love.touchmoved(id,x,y,dx,dy)
@@ -446,24 +574,8 @@ function love.touchmoved(id,x,y,dx,dy)
if not Buttons.sel then
touching=nil
end
if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(x,y)
dx,dy=dx*screenK,dy*screenK
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
if touchMove[scene]then
touchMove[scene](id,xOy:inverseTransformPoint(x,y))
end
end
@@ -478,6 +590,8 @@ function love.keypressed(i)
for k,B in next,Buttons[scene]do
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end
elseif i=="s"then
print(scr.x,scr.y,scr.w,scr.h,scr.k)
elseif Buttons.sel then
local B=Buttons.sel
if i=="left"then B.x=B.x-10
@@ -533,6 +647,25 @@ function love.receiveData(id,data)
end
]]
function love.lowmemory()
collectgarbage()
end
function love.resize(w,h)
if w>=h then scr.w,scr.h=w,h
else scr.w,scr.h=h,w
end
scr.r=h/w
if h/w>=.5625 then
scr.k=w/1280
scr.x,scr.y=0,(h-w*9/16)*.5
else
scr.k=h/720
scr.x,scr.y=(w-h*16/9)*.5,0
end
xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.update(dt)
--[[
if players then
@@ -575,6 +708,7 @@ function love.update(dt)
updateButton()
end
function love.draw()
gc.discard()
Pnt.BG[curBG]()
gc.setColor(1,1,1,.22)
for n=1,#BGblock do
@@ -600,31 +734,24 @@ function love.draw()
end
if sceneSwaping then sceneSwaping.draw()end
if wh/ww>.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,ww*9/16-wh)
gc.rectangle("fill",0,720,1280,wh-ww*9/16)
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
if scr.r==.5625 then goto L end
if scr.r>.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h)
gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16)
else
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720)
gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720)
end
::L::
setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),5,700)
if devMode then
gc.print(gcinfo(),5,680)
gc.print(freeRow and #freeRow or 0,5,660)
gc.print(#freeRow or 0,5,660)
end
end
function love.resize(w,h)
if w>=h then ww,wh=w,h
else ww,wh=h,w
end
screenK=h/w>=.5625 and w/1280 or h/720
xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.run()
local frameT=Timer()
local readyDrawFrame=0

View File

@@ -9,7 +9,7 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window
W.title="Techmino V0.7.13+"
W.title="Techmino V0.7.14"
W.icon="/image/icon.png"
W.width,W.height=1280,720
W.minwidth,W.minheight=640,360

View File

@@ -149,13 +149,28 @@ loadmode={
modeEnv[k]=customRange[k][customSel[k]]
end
modeEnv._20G=modeEnv.drop==-1
createPlayer(1,340,15)
if modeEnv.opponent==0 then
createPlayer(1,340,15)
else
modeEnv.target=nil
createPlayer(1,340,15)
createPlayer(2,965,360,.5,modeEnv.opponent)
end
local h=20
::R::
for i=1,10 do
if preField[h][i]>0 then modeEnv.Fkey=true goto L end
end
h=h-1
if h>0 then goto R end
::L::
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end
end
end,
}
mesDisp={
@@ -527,7 +542,7 @@ Event_task={
end
end
if P.endCounter==100 then
for i=1,#P.field do
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
@@ -550,7 +565,7 @@ Event_task={
end
end
if P.endCounter==100 then
for i=1,#P.field do
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
@@ -666,7 +681,7 @@ Event_task={
if P.counter==21 then
local t=P.cstat.pc%2
for i=1,4 do
local r=getNewRow()
local r=getNewRow(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
@@ -1092,6 +1107,7 @@ defaultModeEnv={
{
fall=20,
royaleMode=true,
Fkey=true,
royalePowerup={2,5,10,20},
royaleRemain={30,20,15,10,5},
pushSpeed=2,
@@ -1104,6 +1120,7 @@ defaultModeEnv={
{
fall=20,
royaleMode=true,
Fkey=true,
royalePowerup={2,6,14,30},
royaleRemain={75,50,35,20,10},
pushSpeed=2,

BIN
font.ttf

Binary file not shown.

View File

@@ -163,7 +163,14 @@ function resetGameData()
frame=0
garbageSpeed=1
pushSpeed=3
if players then
for _,P in next,players do if P.id then
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
end end
end
players={alive={}}human=0
modeEnv=defaultModeEnv[curMode.id][curMode.lv]or defaultModeEnv[curMode.id][1]
loadmode[curMode.id]()
@@ -193,12 +200,11 @@ function resetGameData()
virtualkey[i].press=false
end
stat.game=stat.game+1
freeRow={}
collectgarbage()
for i=1,30*#players do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
local p=60*#players
while freeRow[p]do
rem(freeRow)
end
collectgarbage()
end
function gameStart()
sysSFX("start")
@@ -224,6 +230,7 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.size=P.size*5
else
P.centerX,P.centerY=P.x+300*P.size,P.y+670*P.size
P.absFieldPos={P.x+150*P.size,P.y+60*P.size}
end
if AIspeed then
@@ -666,6 +673,7 @@ function spin(d,ifpre)
end
goto fail
::spin::
createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
P.curX,P.curY,P.dir=ix,iy,idir
P.sc,P.cur.bk=scs[P.cur.id][idir],icb
P.r,P.c=ir,ic
@@ -673,7 +681,7 @@ function spin(d,ifpre)
freshgho()
freshLockDelay()
SFX(ifpre and"prerotate"or ifoverlap(P.cur.bk,P.curX,P.curY+1)and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate")
if id==1 then
if P.id==1 then
stat.rotate=stat.rotate+1
end
::fail::
@@ -907,7 +915,7 @@ end
function lock()
for i=1,P.r do
local y=P.curY+i-1
if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(),getNewRow()end
if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(0),getNewRow(0)end
for j=1,P.c do
if P.cur.bk[i][j]then
P.field[y][P.curX+j-1]=P.cur.color
@@ -994,7 +1002,7 @@ act={
end
end,
rotRight=function()spin(1)end,
rotLeft=function()spin(3)end,
rotLeft=function()spin(-1)end,
rotFlip=function()spin(2)end,
hardDrop=function()
if P.keyPressing[9]and setting.swap then
@@ -1057,7 +1065,7 @@ act={
local x0=cx
::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then
P.curX=P.curX-1
createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY)
createShade(P.curX+1,P.curY+P.r-1,P.curX+P.c-1,P.curY)
freshgho()
goto L
end
@@ -1067,7 +1075,7 @@ act={
local x0=cx
::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then
P.curX=P.curX+1
createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY)
freshgho()
goto L
end

View File

@@ -146,6 +146,24 @@ return{
left="<",
right=">",
start="开始",
draw="画图(D)",
back="返回",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="清空",
back="返回",
},
play={
@@ -193,4 +211,4 @@ return{
path="打开存储目录",
},
},
}--中文
}--中文

View File

@@ -109,7 +109,7 @@ return{
"Total spin:",
},
help={
"I think you don't need \"help\".",
"I don't think you need \"help\".",
"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",
@@ -146,8 +146,26 @@ return{
left="<",
right=">",
start="Start",
draw="Draw(D)",
back="Back",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="clear",
back="back",
},
play={
back="Back",
},

124
list.lua
View File

@@ -1,6 +1,6 @@
local gc=love.graphics
local sys=love.system
local fs=love.filesystem
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"}
color={
red={1,0,0},
@@ -31,9 +31,24 @@ color={
orange={1,.6,0},
lightOrange={1,.7,.3},
purple={.5,0,1},
lightPurple={.7,.3,1},
lightPurple={.8,.4,1},
darkPurple={.3,0,.6},
}
blockColor={
color.red,
color.green,
color.orange,
color.blue,
color.magenta,
color.yellow,
color.cyan,
color.darkGreen,
color.darkGrey,
color.grey,
color.darkPurple,
color.darkRed,
color.darkGreen,
}
sfx={
"button",
"ready","start","win","fail","collect",
@@ -208,59 +223,84 @@ Buttons={
quit={x=1180,y=620,w=120,h=120,rgb=color.lightGrey,f=50,code=function()gotoScene("quit")end,up="setting",left="help"},
},
mode={
up={x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return modeSel==1 end,f=64,code=function()keyDown.mode("up")end},
down={x=1000,y=430,w=200,h=140,rgb=color.white,hide=function()return modeSel==#modeID end,f=80,code=function()keyDown.mode("down")end},
left={x=190,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==1 end,code=function()keyDown.mode("left")end},
right={x=350,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==#modeLevel[modeID[modeSel]] end,code=function()keyDown.mode("right")end},
start={x=1000,y=600,w=250,h=100,rgb=color.green,f=50,code=function()loadGame(modeSel,levelSel)end},
custom={x=270,y=540,w=190,h=85,rgb=color.yellow,code=function()gotoScene("custom")end},
back={x=640,y=630,w=230,h=90,rgb=color.white,f=45,code=back},
up= {x=1000, y=210,w=200,h=140,rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,},
down= {x=1000, y=430,w=200,h=140,rgb=color.white, f=80, code=function()keyDown.mode("down")end, hide=function()return modeSel==#modeID end,},
left= {x=190, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("left")end, hide=function()return levelSel==1 end,},
right={x=350, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("right")end,hide=function()return levelSel==#modeLevel[modeID[modeSel]]end,},
start={x=1000, y=600,w=250,h=100,rgb=color.green, f=50, code=function()
loadGame(modeSel,levelSel)end},
custom={x=275, y=420,w=200,h=90, rgb=color.yellow, code=function()gotoScene("custom")end},
back= {x=640, y=630,w=230,h=90, rgb=color.white, f=45, code=back},
},
custom={
up={x=1000,y=200,w=100,h=100,rgb=color.white,code=function()optSel=(optSel-2)%#customID+1 end},
down={x=1000,y=440,w=100,h=100,rgb=color.white,f=50,code=function()optSel=optSel%#customID+1 end},
left={x=880,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
right={x=1120,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
start={x=1000,y=580,w=180,h=80,rgb=color.green,code=function()loadGame(0,1)end},
back={x=640,y=630,w=180,h=60,rgb=color.white,code=back},
up= {x=1000, y=220,w=100,h=100,rgb=color.white, code=function()optSel=(optSel-2)%#customID+1 end},
down= {x=1000, y=460,w=100,h=100,rgb=color.white,f=50, code=function()optSel=optSel%#customID+1 end},
left= {x=880, y=340,w=100,h=100,rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
right={x=1120, y=340,w=100,h=100,rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
start={x=1000, y=580,w=180,h=80, rgb=color.green, code=function()loadGame(0,1)end},
draw= {x=1000, y=90, w=190,h=85, rgb=color.cyan, code=function()gotoScene("draw")end},
back= {x=640, y=630,w=180,h=60, rgb=color.white, code=back},
},
draw={
block1= {x=840, y=80,w=120,h=120, f=65, rgb=color.red, code=function()pen=1 end},
block2= {x=980, y=80,w=120,h=120, f=65, rgb=color.green, code=function()pen=2 end},
block3= {x=1120, y=80,w=120,h=120, f=65, rgb=color.orange, code=function()pen=3 end},
block4= {x=840, y=220,w=120,h=120,f=65, rgb=color.blue, code=function()pen=4 end},
block5= {x=980, y=220,w=120,h=120,f=65, rgb=color.magenta, code=function()pen=5 end},
block6= {x=1120, y=220,w=120,h=120,f=65, rgb=color.yellow, code=function()pen=6 end},
block7= {x=840, y=360,w=120,h=120,f=65, rgb=color.cyan, code=function()pen=7 end},
gb1= {x=980, y=360,w=120,h=120,f=65, rgb=color.darkGrey, code=function()pen=9 end},
gb2= {x=1120, y=360,w=120,h=120,f=65, rgb=color.grey, code=function()pen=10 end},
gb3= {x=840, y=500,w=120,h=120,f=65, rgb=color.darkPurple, code=function()pen=11 end},
gb4= {x=980, y=500,w=120,h=120,f=65, rgb=color.darkRed, code=function()pen=12 end},
gb5= {x=1120, y=500,w=120,h=120,f=65, rgb=color.darkGreen, code=function()pen=13 end},
erase= {x=840, y=640,w=120,h=120,f=70, rgb=color.grey, code=function()pen=0 end},
clear= {x=1120, y=640,w=120,h=120, rgb=color.white, code=function()
if clearSureTime>0 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
clearSureTime=0
else
clearSureTime=50
end
end},
back= {x=1235, y=45, w=80, h=80, f=35, rgb=color.white, code=back},
},
play={
back={x=1235,y=45,w=80,h=80,rgb=color.white,code=back,f=35},
},
setting={--Normal setting
ghost= {x=290, y=90, w=210, h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"},
center= {x=505, y=90, w=210, h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"},
grid= {x=290, y=160, w=210, h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"},
swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"},
fxs= {x=290, y=230, w=210, h=60, rgb=color.white, code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="fullscreen"},
ghost= {x=290, y=90, w=210,h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"},
center= {x=505, y=90, w=210,h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"},
grid= {x=290, y=160,w=210,h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"},
swap= {x=505, y=160,w=210,h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"},
fxs= {x=290, y=230,w=210,h=60, rgb=color.white, code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="fullscreen"},
dasD= {x=210, y=300,w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"},
dasU= {x=370, y=300,w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"},
arrD= {x=425, y=300,w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"},
arrU= {x=585, y=300,w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="bgblock"},--3~6
sddasD= {x=210, y=370,w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"},
sddasU= {x=370, y=370,w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"},
sdarrD= {x=425, y=370,w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"},
sdarrU= {x=585, y=370,w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"},
dasD= {x=210, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"},
dasU= {x=370, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"},
arrD= {x=425, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"},
arrU= {x=585, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="bgblock"},--3~6
sddasD= {x=210, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"},
sddasU= {x=370, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"},
sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"},
sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"},
sfx= {x=760, y=90, w=160, h=60, rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"},
bgm= {x=940, y=90, w=160, h=60, rgb=color.white, code=function()
sfx= {x=760,y=90, w=160,h=60,rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"},
bgm= {x=940,y=90, w=160,h=60,rgb=color.white, code=function()
BGM()
setting.bgm=not setting.bgm
BGM("blank")
end,down="vib",left="sfx"},
vib= {x=850, y=160, w=340, h=60, rgb=color.white, code=function()
vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function()
setting.vib=(setting.vib+1)%5
VIB(2)
end,up="sfx",down="fullscreen",left="swap"},
fullscreen= {x=850, y=230, w=340, h=60, rgb=color.white, code=function()
fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
end
end,up="vib",down="bgblock",left="arrU"},
bgblock= {x=850, y=300, w=340, h=60, rgb=color.white, code=function()
bgblock= {x=850,y=300, w=340,h=60,rgb=color.white, code=function()
setting.bgblock=not setting.bgblock
if not setting.bgblock then
for i=1,16 do
@@ -268,17 +308,17 @@ Buttons={
end
end
end,up="fullscreen",down="frame",left="sdarrU"},
frame= {x=850, y=370, w=340, h=60, rgb=color.white, code=function()
frame= {x=850,y=370, w=340,h=60,rgb=color.white, code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end
end,up="bgblock",down="control",left="sdarrU"},
control= {x=850, y=440, w=340, h=60, rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"},
touch= {x=850, y=510, w=340, h=60, rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"},
lang= {x=280, y=510, w=200, h=60, rgb=color.red, code=function()
control= {x=850,y=440, w=340,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"},
touch= {x=850,y=510, w=340,h=60,rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"},
lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
end,up="sddasD",down="back",right="touch"},
back= {x=640, y=620, w=300, h=70, rgb=color.white, code=back,up="touch"},
back= {x=640,y=620, w=300,h=70,rgb=color.white, code=back,up="touch"},
},
setting2={--Control setting
back={x=840,y=630,w=180,h=60,rgb=color.white,code=back},
@@ -317,11 +357,11 @@ Buttons={
},
help={
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"},
qq={x=980,y=590,w=230,h=60,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"},
qq={x=980,y=590,w=230,h=60,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"},
},
stat={
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"},
path={x=980,y=590,w=250,h=60,f=30,rgb=color.white,code=function()sys.openURL("C:/Users/MrZ/AppData/Roaming/LOVE/Techmino")end,left="back"},
path={x=980,y=590,w=250,h=60,f=30,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL(fs.getSaveDirectory())end,left="back"},
},
sel=nil,--selected button id(integer)
}

View File

@@ -1,5 +1,4 @@
local gc=love.graphics
local tm=love.timer
local gc,tm=love.graphics,love.timer
local ms,kb=love.mouse,love.keyboard
local fs,sys=love.filesystem,love.system
int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
@@ -8,6 +7,7 @@ ins,rem,sort=table.insert,table.remove,table.sort
null=function()end
system=sys.getOS()
scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
scene=""
bgmPlaying=nil
curBG="none"
@@ -44,6 +44,7 @@ gameEnv0={
keepVisible=true,visible="show",
sequence="bag7",
block=true,
Fkey=false,
ospin=true,
freshLimit=1e99,
target=1e99,
@@ -64,6 +65,11 @@ customSel={
freshLimit=3,
opponent=1,
}
preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={}
for i=1,40 do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end
--Game system Data
setting={
ghost=true,center=true,

View File

@@ -53,12 +53,6 @@ local function stencil_miniTitle()
gc.rectangle("fill",unpack(miniTitle_rect[i]))
end
end
local function stencil_field()
gc.rectangle("fill",0,-10,300,610)
end
local function stencil_field_small()
gc.rectangle("fill",0,0,60,120)
end
FX={
flash=0,--Black screen(frame)
@@ -187,7 +181,8 @@ end
function VirtualkeyPreview()
for i=1,#virtualkey do
gc.setColor(1,sel==i and .5 or 1,sel==i and .5 or 1,setting.virtualkeyAlpha*.2)
local c=sel==i and .8 or 1
gc.setColor(c,c,c,setting.virtualkeyAlpha*.2)
local b=virtualkey[i]
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2],b[4]-5)
@@ -198,16 +193,18 @@ function drawVirtualkey()
local a=setting.virtualkeyAlpha*.2
local P=players[1]
for i=1,#virtualkey do
local p,b=virtualkeyDown[i],virtualkey[i]
if p then gc.setColor(.7,.7,.7,a)
else gc.setColor(1,1,1,a)
end
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end
if virtualkeyPressTime[i]>0 then
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1)
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04))
if i~=9 or modeEnv.Fkey then
local p,b=virtualkeyDown[i],virtualkey[i]
if p then gc.setColor(.7,.7,.7,a)
else gc.setColor(1,1,1,a)
end
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end
if virtualkeyPressTime[i]>0 then
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1)
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04))
end
end
end
end
@@ -247,6 +244,7 @@ function Pnt.BG.strap()
end
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end
function Pnt.BG.matrix()
gc.clear(.15,.15,.15)
for i=0,15 do
for j=0,8 do
local t=sin(matrixT[i][j]*Timer())*.2+.2
@@ -287,7 +285,7 @@ function Pnt.main()
gc.setColor(1,1,1)
gc.draw(titleImage,300,30)
setFont(30)
gc.print("Alpha V0.7.13+",290,140)
gc.print("Alpha V0.7.14",290,140)
gc.print(system,800,110)
end
function Pnt.mode()
@@ -327,6 +325,38 @@ function Pnt.custom()
end
end
end
function Pnt.draw()
gc.translate(200,60)
gc.setColor(1,1,1,.2)
gc.setLineWidth(1)
for x=1,9 do gc.line(30*x,0,30*x,600)end
for y=0,19 do gc.line(0,30*y,300,30*y)end
gc.setColor(1,1,1)
gc.setLineWidth(3)
gc.rectangle("line",-2,-2,304,604)
for y=1,20 do for x=1,10 do
if preField[y][x]>0 then
drawPixel(y,x,preField[y][x])
end
end end
if sx and sy then
gc.setLineWidth(2)
gc.rectangle("line",30*sx-30,600-30*sy,30,30)
end
gc.translate(-200,-60)
if clearSureTime>0 then
gc.setColor(1,1,1,clearSureTime*.02)
gc.draw(drawableText.question,1100,570)
end
if pen>0 then
gc.setLineWidth(13)
gc.setColor(blockColor[pen])
gc.rectangle("line",945,605,70,70)
else
gc.setColor(.8,.8,.8)
gc.draw(drawableText.x,950,560)
end
end
function Pnt.play()
for p=1,#players do
P=players[p]
@@ -334,20 +364,22 @@ function Pnt.play()
gc.push("transform")
gc.translate(P.x,P.y)gc.scale(P.size)--Scale
gc.setColor(0,0,0,.4)gc.rectangle("fill",0,0,60,120)--Black Background
gc.stencil(stencil_field_small,"replace",1)
gc.translate(0,P.fieldBeneath*.2)
gc.setStencilTest("equal",1)
gc.setScissor(scr.x+P.x*scr.k,scr.y+P.y*scr.k,60*P.size*scr.k,120*P.size*scr.k)
gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1)
local h=#P.clearing
for j=int(P.fieldBeneath/30+1),#P.field do
if P.falling<=0 or without(P.clearing,j)then
if j==P.clearing[h]and P.falling>-1 then
h=h-1
else
for i=1,10 do
if P.field[j][i]>0 then
gc.draw(blockSkinmini[P.field[j][i]],6*i-6,120-6*j)
end
end
end
end
gc.setStencilTest()--In-playField mask
end--Field
gc.setScissor()
gc.translate(0,-P.fieldBeneath*.2)
gc.setLineWidth(2)
gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder
@@ -380,10 +412,9 @@ function Pnt.play()
gc.setColor(1,1,1,.2)
for x=1,9 do gc.line(30*x,-10,30*x,600)end
for y=0,19 do gc.line(0,30*y,300,30*y)end
end
gc.stencil(stencil_field,"replace", 1)
end--Grid lines
gc.translate(0,P.fieldBeneath)
gc.setStencilTest("equal",1)
gc.setScissor(scr.x+P.absFieldPos[1]*scr.k,scr.y+P.absFieldPos[2]*scr.k,300*P.size*scr.k,610*P.size*scr.k)
local h=#P.clearing
for j=int(P.fieldBeneath/30+1),#P.field do
if j==P.clearing[h]and P.falling>-1 then
@@ -393,7 +424,7 @@ function Pnt.play()
else
for i=1,10 do
if P.field[j][i]>0 then
gc.setColor(1,1,1,min(P.visTime[j][i],20)*.05)
gc.setColor(1,1,1,min(P.visTime[j][i]*.05,1))
drawPixel(j,i,P.field[j][i])
end
end
@@ -401,13 +432,13 @@ function Pnt.play()
end--Field
for i=1,#P.shade do
local S=P.shade[i]
gc.setColor(1,1,1,.15+S[1]*.08)
gc.setColor(1,1,1,S[1]*.12)
for x=S[3],S[5]do
for y=S[6],S[4]do
drawPixel(y,x,S[2])
end
end
end
end--shade FX
if P.waiting==-1 then
if P.gameEnv.ghost then
gc.setColor(1,1,1,.3)
@@ -442,7 +473,7 @@ function Pnt.play()
gc.setColor(1,1,1)
gc.draw(PTC.dust[p])
--Draw game field
gc.setStencilTest()--In-playField mask
gc.setScissor()--In-playField mask
gc.translate(0,-P.fieldBeneath)
gc.setLineWidth(3)
gc.setColor(1,1,1)

View File

@@ -8,7 +8,6 @@ local function C(x,y)
end
gc.setDefaultFilter("nearest","nearest")
local blockImg=N("/image/block/1.png")
blockSkin,blockSkinmini={},{}
for i=1,13 do
@@ -26,15 +25,6 @@ for i=1,10 do
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
end
local blockColor={
color.red,
color.green,
color.orange,
color.blue,
color.magenta,
color.yellow,
color.cyan,
}
gc.setColor(1,1,1)
mouseBlock={}
for i=1,7 do
@@ -92,8 +82,9 @@ background1=N("/image/BG/bg1.jpg")
background2=N("/image/BG/bg2.png")
groupCode=N("/image/mess/groupcode.png")
payCode=N("/image/mess/paycode.png")
drawableText={
question=T(100,"?"),
x=T(110,"×"),
bpm=T(15,"BPM"),
kpm=T(15,"KPM"),
modeName=T(30),
@@ -101,5 +92,4 @@ drawableText={
next=T(40),
hold=T(40),
}
c=gc.setCanvas()

View File

@@ -45,6 +45,9 @@ function Tmr.intro()
count=count+1
if count==200 then count=80 end
end
function Tmr.draw()
if clearSureTime>0 then clearSureTime=clearSureTime-1 end
end
function Tmr.play(dt)
frame=frame+1
stat.gametime=stat.gametime+dt

View File

@@ -1,4 +1,5 @@
local gc=love.graphics
local kb=love.keyboard
local setFont=setFont
local toN,toS=tonumber,tostring
@@ -11,25 +12,18 @@ local function splitS(s,sep)
if #s~=0 then goto L end
return t
end
function without(t,v)
for i=1,#t do
if t[i]==v then return end
end
return true
end
function mStr(s,x,y)
gc.printf(s,x-300,y,600,"center")
end
function getNewRow(val)
if not val then val=0 end
local t=rem(freeRow)
for i=1,10 do
t[i]=val or 0
t[i]=val
end
--clear a row and move to active list
if #freeRow==0 then
for i=1,20 do
for i=1,10 do
ins(freeRow,{0,0,0,0,0,0,0,0,0,0})
end
end
@@ -177,13 +171,16 @@ function gotoScene(s,style)
Buttons.sel=nil
end
end
local prevMenu={
load=love.event.quit,
intro="quit",
main="intro",
mode="main",
custom="mode",
draw=function()
kb.setKeyRepeat(false)
gotoScene("custom")
end,
ready="mode",
play=function()
clearTask("play")