worksgit add -A!
This commit is contained in:
commit
20b30e0731
840
main.lua
Normal file
840
main.lua
Normal file
|
@ -0,0 +1,840 @@
|
|||
local board={}
|
||||
local bw,bh=10,10
|
||||
local g=love.graphics
|
||||
local font=g.newFont(9,"mono")
|
||||
font:setFilter("nearest")
|
||||
g.setFont(font)
|
||||
local colors={
|
||||
function(a,b)
|
||||
g.setColor(1,0,0,b*a)
|
||||
g.polygon("fill",0.5,0, 1,0.5, 0.5,1, 0,0.5)
|
||||
g.setColor(1,0,0,a)
|
||||
g.polygon("line",0.5,0, 1,0.5, 0.5,1, 0,0.5)
|
||||
end,
|
||||
function(a,b)
|
||||
local w=0.5^0.5
|
||||
local p=(1-w)/2
|
||||
g.setColor(1,1,0,b*a)
|
||||
g.rectangle("fill",p,p,w,w)
|
||||
g.setColor(1,1,0,a)
|
||||
g.rectangle("line",p,p,w,w)
|
||||
end,
|
||||
function(a,b)
|
||||
g.setColor(0,1,0,b*a)
|
||||
g.circle("fill",0.5,0.5,0.45,8)
|
||||
g.setColor(0,1,0,a)
|
||||
g.circle("line",0.5,0.5,0.45,8)
|
||||
end,
|
||||
function(a,b)
|
||||
g.translate(0,0.15)
|
||||
g.translate(0.5,0.5)
|
||||
g.rotate(math.pi/2*3)
|
||||
g.translate(-0.5,-0.5)
|
||||
g.setColor(0,1,1,b*a)
|
||||
g.circle("fill",0.5,0.5,0.5,3)
|
||||
g.setColor(0,1,1,a)
|
||||
g.circle("line",0.5,0.5,0.5,3)
|
||||
end,
|
||||
function(a,b)
|
||||
g.translate(0.5,0.5)
|
||||
g.rotate(math.pi/2*3)
|
||||
g.translate(-0.5,-0.5)
|
||||
g.setColor(1,0,1,b*a)
|
||||
g.circle("fill",0.5,0.5,0.45,6)
|
||||
g.setColor(1,0,1,a)
|
||||
g.circle("line",0.5,0.5,0.45,6)
|
||||
end,
|
||||
function(a,b)
|
||||
g.setColor(0,0,1,b*a)
|
||||
g.setColor(0,0,1,a)
|
||||
g.line(0.1,0.4, 0.5,0, 0.9,0.4)
|
||||
g.line(0.1,1-0.4, 0.5,1-0, 0.9,1-0.4)
|
||||
g.line(0.3,0.5, 0.7,0.5)
|
||||
end,
|
||||
}
|
||||
local gobjs={}
|
||||
local cgobjs={}
|
||||
local lgobjs={}
|
||||
local mgobjs={}
|
||||
for k,v in ipairs(colors) do
|
||||
gobjs[k]={c=k}
|
||||
cgobjs[k]={c=k,super="charge"}
|
||||
lgobjs[k]={c=k,super="lines"}
|
||||
mgobjs[k]={c=k,super="color"}
|
||||
end
|
||||
local cc=3
|
||||
local tt=0
|
||||
local bat=1
|
||||
local batd=bat
|
||||
local score=0
|
||||
local scored=score
|
||||
local function znoise(...)
|
||||
return love.math.noise(...)*2-1
|
||||
end
|
||||
local function drawfig(n,a)
|
||||
g.push("all")
|
||||
g.scale(2-(a or 1))
|
||||
g.translate(-0.5,-0.5)
|
||||
g.translate(0.1,0.1)
|
||||
g.scale(0.8)
|
||||
colors[n.c](a or 1,n.super=="charge" and ((math.sin(tt*math.pi*2)*0.5+0.5)*0.4+0.1) or 0)
|
||||
if n.super=="lines" then
|
||||
local hps,vps={},{}
|
||||
local det=10
|
||||
for n=0,det do
|
||||
local dmul=(det-math.abs(n-det/2))/det*4
|
||||
hps[n*2+1],hps[n*2+2]=n/det,0.5+znoise(tt,583,-775,n)*0.1*dmul
|
||||
vps[n*2+1],vps[n*2+2]=0.5+znoise(tt,-492,444,n)*0.1*dmul,n/det
|
||||
end
|
||||
g.line(hps)
|
||||
g.line(vps)
|
||||
elseif n.super=="color" then
|
||||
local l={}
|
||||
local det=100
|
||||
for n=0,det do
|
||||
l[n*2+1],l[n*2+2]=0.5+znoise(tt,55,51,n*math.pi/det*2),0.5+znoise(tt,44,25,n*math.pi/det*2)
|
||||
end
|
||||
g.setLineJoin("none")
|
||||
g.polygon("line",l)
|
||||
end
|
||||
g.scale(0.02)
|
||||
g.pop()
|
||||
end
|
||||
|
||||
local function pti(x,y)
|
||||
return y+(x-1)*bh
|
||||
end
|
||||
|
||||
local trans=love.math.newTransform()
|
||||
local anims={}
|
||||
local falling={}
|
||||
local booms={}
|
||||
|
||||
local function smtar(x,y,tx,ty)
|
||||
local i=pti(x,y)
|
||||
local anim
|
||||
if not anims[i] then
|
||||
if x==tx and y==ty then return end
|
||||
anims[i]={
|
||||
cx=x,cy=y,
|
||||
tx=tx,ty=ty,
|
||||
x=x,y=y
|
||||
}
|
||||
end
|
||||
anim=anims[i]
|
||||
anim.tx,anim.ty=tx,ty
|
||||
end
|
||||
|
||||
local function setbsize(x,y,w,h)
|
||||
trans:reset()
|
||||
trans:translate(x,y)
|
||||
trans:scale(w/bw,h/bh)
|
||||
end
|
||||
|
||||
local gemrng
|
||||
local function randgem()
|
||||
local objl=gemrng:random()>0.99 and cgobjs or gobjs
|
||||
return objl[gemrng:random(math.floor(cc))]
|
||||
end
|
||||
local function nextgem(o)
|
||||
local c=o.c%math.floor(cc)+1
|
||||
return (o.super and cgobjs or gobjs)[c]
|
||||
end
|
||||
local function isgem(o)
|
||||
return type(o)=="table" and colors[o.c]
|
||||
end
|
||||
local function eqgem(a,b)
|
||||
return isgem(a) and isgem(b) and a.c==b.c
|
||||
end
|
||||
|
||||
local function badboigemcheck(c,am,ac,rm)
|
||||
c=isgem(c) and c.c
|
||||
if not c then return end
|
||||
if ac~=5 and ac~=4 then return end
|
||||
local aa={}
|
||||
for k,v in pairs(am) do
|
||||
local cc=board[v[1]][v[2]]
|
||||
if isgem(cc) and (cc.super and cc.super~="charge") then
|
||||
return
|
||||
end
|
||||
aa[#aa+1]=k
|
||||
end
|
||||
local e=aa[gemrng:random(#aa)]
|
||||
local rc=ac==5 and mgobjs[c] or lgobjs[c]
|
||||
rm[e][3]=rc
|
||||
end
|
||||
local function megascan(c,rm)
|
||||
local ogc=c
|
||||
if not isgem(ogc) then return end
|
||||
rm=rm or {}
|
||||
if ogc.super~="color" then return end
|
||||
for x=1,bw do
|
||||
for y=1,bh do
|
||||
local i=pti(x,y)
|
||||
local c=board[x][y]
|
||||
if eqgem(c,ogc) then
|
||||
rm[i]=rm[i] or {x,y}
|
||||
end
|
||||
end end
|
||||
return next(rm) and rm
|
||||
end
|
||||
local function check(x,y,rm,oam,obm)
|
||||
local c=board[x][y]
|
||||
if not c then return end
|
||||
local ac,bc=1,1
|
||||
local am,bm={},{}
|
||||
oam,obm=oam or {}, obm or {}
|
||||
do
|
||||
local i=pti(x,y)
|
||||
local v={x,y}
|
||||
am[i],bm[i]=v,v
|
||||
end
|
||||
rm=rm or {}
|
||||
for d,v in ipairs{{-1,0},{1,0},{0,-1},{0,1}} do
|
||||
local ox,oy=unpack(v)
|
||||
local x,y=x+ox,y+oy
|
||||
while x>=1 and x<=bw and y>=1 and y<=bh do
|
||||
local i=pti(x,y)
|
||||
if eqgem(board[x][y],c) then
|
||||
if d>2 and not oam[i] then
|
||||
ac=ac+1
|
||||
am[i]={x,y}
|
||||
oam[i]=true
|
||||
elseif d<=2 and not obm[i] then
|
||||
bc=bc+1
|
||||
bm[i]={x,y}
|
||||
obm[i]=true
|
||||
end
|
||||
else
|
||||
break
|
||||
end
|
||||
x,y=x+ox,y+oy
|
||||
end
|
||||
end
|
||||
if ac>=3 then
|
||||
for k,v in pairs(am) do rm[k]=v end
|
||||
badboigemcheck(c,am,ac,rm)
|
||||
end
|
||||
if bc>=3 then
|
||||
for k,v in pairs(bm) do rm[k]=v end
|
||||
badboigemcheck(c,bm,bc,rm)
|
||||
end
|
||||
return next(rm) and rm,oam,obm
|
||||
end
|
||||
|
||||
local falltest=false
|
||||
|
||||
local function drawboard(x,y,w,h)
|
||||
g.push("all")
|
||||
g.applyTransform(trans)
|
||||
g.setLineWidth(0.1)
|
||||
g.stencil(function()
|
||||
g.rectangle("fill",0,0,bw,bh)
|
||||
end)
|
||||
g.push("all")
|
||||
g.translate(0.1,-1-0.05)
|
||||
local bat=math.min(batd,1)
|
||||
g.setColor((1-bat^2),bat^0.5,math.max(0,batd-1)^0.5)
|
||||
g.rectangle("line",0,0,bw/2-0.1,0.8)
|
||||
g.rectangle("fill",0.2,0.2,(bw/2-0.5)*bat,0.4)
|
||||
g.rectangle("line",bw/2-0.09,0.2,0.2,0.4)
|
||||
g.pop()
|
||||
g.push("all")
|
||||
local sctext=("%.1i"):format(math.floor(scored+.5))
|
||||
local xx,yy=trans:transformPoint(0,0)
|
||||
local tty=0.8/font:getHeight()
|
||||
local ttx=font:getWidth(sctext)*tty
|
||||
g.translate(bw-ttx,-1.1)
|
||||
g.scale(tty)
|
||||
g.setColor(1,1,1)
|
||||
g.print(sctext)
|
||||
g.pop()
|
||||
if not falltest then
|
||||
g.setStencilTest("greater",0)
|
||||
end
|
||||
for x=1,bw do
|
||||
for y=1,bh do
|
||||
g.push()
|
||||
local tx,ty=x,y
|
||||
local anim=anims[pti(x,y)]
|
||||
if anim then
|
||||
tx,ty=anim.cx or x, anim.cy or y
|
||||
end
|
||||
g.translate(tx-0.5,ty-0.5)
|
||||
if isgem(board[x][y]) then
|
||||
drawfig(board[x][y])
|
||||
end
|
||||
g.pop()
|
||||
end
|
||||
end
|
||||
for x,falling in ipairs(falling) do
|
||||
for fall,_ in pairs(falling) do
|
||||
for i,c in ipairs(fall.figs) do
|
||||
g.push("all")
|
||||
local tx,ty=fall.x,fall.y-i+1
|
||||
g.translate(tx-0.5,ty-0.5)
|
||||
if isgem(c) then
|
||||
drawfig(c)
|
||||
end
|
||||
g.pop()
|
||||
end
|
||||
end
|
||||
end
|
||||
for v,_ in pairs(booms) do
|
||||
g.push("all")
|
||||
local tx,ty=v.x,v.y
|
||||
g.translate(tx-0.5,ty-0.5)
|
||||
drawfig(v.c,v.a)
|
||||
g.pop()
|
||||
end
|
||||
g.setStencilTest()
|
||||
g.setColor(0.2,0.2,0.2)
|
||||
g.rectangle("line",0,0,bw,bh)
|
||||
g.pop()
|
||||
end
|
||||
local function fall(l)
|
||||
local cols={}
|
||||
for k,v in pairs(l) do
|
||||
local x,y=unpack(v)
|
||||
cols[x]=cols[x] or {l={},m={}}
|
||||
cols.l[#cols+1]=y
|
||||
cols.m[y]=true
|
||||
end
|
||||
end
|
||||
local killall
|
||||
|
||||
local function kill(x,y,rc)
|
||||
if not board[x][y] then print("Whar") return end
|
||||
if board[x][y].super=="charge" then
|
||||
bat=math.min(2,bat+0.1)
|
||||
end
|
||||
do
|
||||
local tx,ty=x,y
|
||||
local anim=anims[pti(x,y)]
|
||||
if anim then
|
||||
tx,ty=anim.cx,anim.cy
|
||||
end
|
||||
booms[{
|
||||
x=tx,y=ty,
|
||||
a=1,c=board[x][y] or mgobjs[4]
|
||||
}]=true
|
||||
end
|
||||
if rc then
|
||||
board[x][y]=rc
|
||||
return true
|
||||
end
|
||||
board[x][y]=nil
|
||||
local fall={}
|
||||
for y=y-1,gem and 1 or (-bh+1),-1 do
|
||||
if board[x][y] then
|
||||
if not fall.figs then
|
||||
fall.x,fall.y=x,y
|
||||
fall.figs={}
|
||||
fall.vel=0
|
||||
falling[x][fall]=true
|
||||
end
|
||||
fall.figs[#fall.figs+1]=board[x][y]
|
||||
board[x][y]=nil
|
||||
elseif fall.figs then
|
||||
fall={}
|
||||
end
|
||||
end
|
||||
local my,mfall=math.huge
|
||||
local unfell={}
|
||||
local yls={}
|
||||
local cx=x
|
||||
for x=1,bw do
|
||||
local yl
|
||||
for y=bh,0,-1 do
|
||||
if not board[x][y] then
|
||||
yl=y
|
||||
break
|
||||
end
|
||||
end
|
||||
unfell[x]={}
|
||||
local tt={}
|
||||
for k,v in pairs(falling[x]) do
|
||||
tt[#tt+1]=k
|
||||
end
|
||||
table.sort(tt,function(a,b)
|
||||
return a.y>b.y
|
||||
end)
|
||||
for _,fall in ipairs(tt) do
|
||||
if cx==x and fall.y<my then
|
||||
my=fall.y
|
||||
mfall=fall
|
||||
end
|
||||
for k,v in ipairs(fall.figs) do
|
||||
unfell[x][yl]={board[x][yl]}
|
||||
board[x][yl]=v
|
||||
yl=yl-1
|
||||
end
|
||||
end
|
||||
yls[x]=yl
|
||||
end
|
||||
local yl=yls[x]
|
||||
if not mfall then
|
||||
mfall={x=x,y=0,vel=0,figs={}}
|
||||
falling[x][mfall]=true
|
||||
end
|
||||
local ll=#mfall.figs+1
|
||||
mfall.figs[ll]=randgem()
|
||||
local aa={}
|
||||
unfell[x][yls[x]]=unfell[x][yls[x]] or {board[x][yls[x]]}
|
||||
board[x][yls[x]]=mfall.figs[ll]
|
||||
local ccc=0
|
||||
if love.keyboard.isDown("f6") then
|
||||
for x,falling in pairs(falling) do
|
||||
for fall,_ in pairs(falling) do
|
||||
falling[fall]=nil
|
||||
end
|
||||
end
|
||||
return
|
||||
end
|
||||
local occ=mfall.figs[ll]
|
||||
while check(x,yls[x]) do
|
||||
mfall.figs[ll]=nextgem(mfall.figs[ll])
|
||||
board[x][yls[x]]=mfall.figs[ll]
|
||||
if eqgem(mfall.figs[ll],occ) then break end
|
||||
end
|
||||
for x,uf in pairs(unfell) do
|
||||
for y,v in pairs(uf) do
|
||||
board[x][y]=v[1]
|
||||
end
|
||||
end
|
||||
cc=math.min(#colors,cc+((0.1/(bw*bh))/((cc/3)^2)))
|
||||
end
|
||||
killall=function(kills,b,...)
|
||||
if not kills then return end
|
||||
if b then
|
||||
for k,v in pairs(b) do
|
||||
kills[k]=v
|
||||
end
|
||||
return killall(kills,...)
|
||||
end
|
||||
local tt={}
|
||||
local kills,ko={},kills
|
||||
for k,v in pairs(ko) do
|
||||
kills[k]=v
|
||||
local x,y=unpack(v)
|
||||
local c=board[v[1]][v[2]]
|
||||
if isgem(c) and c.super=="lines" then
|
||||
for x=1,bw do
|
||||
local i=pti(x,y)
|
||||
if board[x][y] then
|
||||
kills[i]=kills[i] or {x,y}
|
||||
end
|
||||
end
|
||||
for y=1,bh do
|
||||
local i=pti(x,y)
|
||||
if board[x][y] then
|
||||
kills[i]=kills[i] or {x,y}
|
||||
end
|
||||
end
|
||||
end
|
||||
if isgem(c) then
|
||||
megascan(c,kills)
|
||||
end
|
||||
end
|
||||
for k,v in pairs(kills) do
|
||||
tt[#tt+1]=v
|
||||
end
|
||||
table.sort(tt,function(a,b)
|
||||
return b[2]>a[2] or b[1]>b[1]
|
||||
end)
|
||||
local checks={}
|
||||
for k,v in ipairs(tt) do
|
||||
local a=kill(unpack(v))
|
||||
if a then
|
||||
checks[k]=v
|
||||
end
|
||||
end
|
||||
local rm,oam,obm={},{},{}
|
||||
for k,v in pairs(checks) do
|
||||
local x,y=unpack(v)
|
||||
check(x,y,rm,oam,obm)
|
||||
end
|
||||
if next(rm) then
|
||||
killall(rm)
|
||||
end
|
||||
score=score+#tt
|
||||
end
|
||||
|
||||
local function dropall(off,die)
|
||||
for x=1,bw do
|
||||
falling[x]=falling[x] or {}
|
||||
local fall={
|
||||
x=x,y=bh+(off or 0),
|
||||
vel=0,
|
||||
figs={}
|
||||
}
|
||||
falling[x][fall]=true
|
||||
for y=bh,1,-1 do
|
||||
fall.figs[#fall.figs+1]=board[x][y]
|
||||
board[x][y]=nil
|
||||
end
|
||||
end
|
||||
if die then
|
||||
for x,falling in pairs(falling) do
|
||||
for fall,_ in pairs(falling) do
|
||||
fall.die=true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function fillboard()
|
||||
cc=3
|
||||
score=0
|
||||
bat=1
|
||||
gemrng=love.math.newRandomGenerator(991)
|
||||
for x=1,bw do
|
||||
board[x]={}
|
||||
for y=1,bh do
|
||||
local a=randgem()
|
||||
board[x][y]=a
|
||||
end
|
||||
end
|
||||
for n=1,math.huge do
|
||||
local good=true
|
||||
local rm={}
|
||||
local kills
|
||||
for x=1,bw do
|
||||
for y=1,bh do
|
||||
kills=check(x,y,rm) or kills
|
||||
end
|
||||
end
|
||||
if not next(rm) then break end
|
||||
for k,v in pairs(rm) do
|
||||
local x,y=unpack(v)
|
||||
board[x][y]=randgem()
|
||||
end
|
||||
end
|
||||
dropall(-bh)
|
||||
end
|
||||
local dbg=false
|
||||
|
||||
function love.load()
|
||||
fillboard()
|
||||
end
|
||||
|
||||
local grabbed=nil
|
||||
local dying=false
|
||||
local running=false
|
||||
|
||||
function love.mousepressed(x,y,b)
|
||||
x,y=trans:inverseTransformPoint(x,y)
|
||||
x,y=x+1-0.5,y+1-0.5
|
||||
local ix,iy=math.floor(x+.5),math.floor(y+.5)
|
||||
if b==2 and dbg then
|
||||
for ix=ix-50,iy+50 do
|
||||
for iy=iy-50,iy+50 do
|
||||
if board[ix] and board[ix][iy] and math.random()>0.1 then
|
||||
kill(ix,iy)
|
||||
end
|
||||
end end
|
||||
end
|
||||
if b~=1 then return end
|
||||
running=true
|
||||
if ix<1 or ix>bw or
|
||||
iy<1 or iy>bh
|
||||
then
|
||||
return
|
||||
end
|
||||
if grabbed then
|
||||
return
|
||||
end
|
||||
grabbed={
|
||||
ix,iy,
|
||||
ix-x,iy-y,
|
||||
}
|
||||
end
|
||||
|
||||
function love.mousereleased(x,y,b)
|
||||
if b~=1 then return end
|
||||
if grabbed then
|
||||
local ix,iy,ox,oy,px,py=unpack(grabbed)
|
||||
if ix and px and (ix~=px or iy~=py) then
|
||||
board[ix][iy],board[px][py]=
|
||||
board[px][py],board[ix][iy]
|
||||
local kills=check(ix,iy,check(px,py,megascan(board[ix][iy],megascan(board[px][py]))))
|
||||
if kills then
|
||||
local ii,pi=pti(ix,iy),pti(px,py)
|
||||
local ania,anib=anims[ii],anims[pi]
|
||||
anims[ii],anims[pi]=anib,ania
|
||||
ania=ania or {x=ix,y=iy}
|
||||
anib=anib or {x=px,y=py}
|
||||
ania.x,anib.x=anib.x,ania.x
|
||||
ania.y,anib.y=anib.y,ania.y
|
||||
grabbed=nil
|
||||
killall(kills)
|
||||
return
|
||||
else
|
||||
board[ix][iy],board[px][py]=
|
||||
board[px][py],board[ix][iy]
|
||||
end
|
||||
end
|
||||
grabbed=nil
|
||||
smtar(ix,iy,ix,iy)
|
||||
if px then
|
||||
smtar(px,py,px,py)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local gacc=50
|
||||
|
||||
-- i forgor how intersections work so here's a thingy to figure it out
|
||||
-- A1-----A2
|
||||
-- B1-----B2
|
||||
--
|
||||
-- B1-----B2
|
||||
-- A1-----A2
|
||||
|
||||
local function inters(a1,a2,b1,b2)
|
||||
return
|
||||
(a1<=b1 and a2>=b1)
|
||||
or (b1<=a1 and b2>=a1)
|
||||
end
|
||||
|
||||
local function negdiff(a,b)
|
||||
return math.abs(a-b)<0.01
|
||||
end
|
||||
|
||||
local function sign(a)
|
||||
return a>0 and 1 or (a<0 and -1 or 0)
|
||||
end
|
||||
|
||||
local function interp(a,b,dt)
|
||||
return a+sign(b-a)*math.min((b-a)*sign(b-a),math.max(dt,(b-a)*sign(b-a)*math.max(dt,0.01)*10))
|
||||
end
|
||||
|
||||
local animc=0
|
||||
local entc=0
|
||||
local boomc=0
|
||||
local slow=false
|
||||
local accumdt=0
|
||||
local tps=120
|
||||
|
||||
function love.update(dt)
|
||||
dt=math.min(dt,0.2)*(slow and 0.05 or 1)
|
||||
accumdt=accumdt+dt
|
||||
local fcc=0
|
||||
while accumdt>1/tps do
|
||||
fcc=fcc+1
|
||||
local dt=1/tps
|
||||
accumdt=accumdt-dt
|
||||
if fcc>10 then return end
|
||||
if running then
|
||||
bat=math.max(0,bat-dt*0.015*(math.max(bat,0.0625)^0.5))
|
||||
end
|
||||
if running then
|
||||
batd=interp(batd,bat,dt)
|
||||
scored=interp(scored,score,dt)
|
||||
end
|
||||
if bat==0 and not dying then
|
||||
dying=true
|
||||
dropall(0,true)
|
||||
end
|
||||
if grabbed then
|
||||
local x,y,ox,oy,px,py=unpack(grabbed)
|
||||
local mx,my=love.mouse.getPosition()
|
||||
mx,my=trans:inverseTransformPoint(mx,my)
|
||||
mx,my=mx+1-0.5+ox,my+1-0.5+oy
|
||||
mx,my=math.floor(mx+.5),math.floor(my+.5)
|
||||
if math.abs(x-mx)>math.abs(y-my) then
|
||||
mx,my=math.min(bw,math.max(1,x+sign(mx-x))),y
|
||||
elseif math.abs(y-my)>0 then
|
||||
my,mx=math.min(bh,math.max(1,y+sign(my-y))),x
|
||||
end
|
||||
if px then
|
||||
smtar(px,py,px,py)
|
||||
end
|
||||
grabbed[5],grabbed[6]=mx,my
|
||||
if not board[x][y] then
|
||||
elseif board[mx][my] then
|
||||
smtar(mx,my,x,y)
|
||||
smtar(x,y,mx,my)
|
||||
end
|
||||
end
|
||||
animc=0
|
||||
entc=0
|
||||
boomc=0
|
||||
for k,v in pairs(anims) do
|
||||
animc=animc+1
|
||||
v.cx=interp(v.cx,v.tx,dt*2)
|
||||
v.cy=interp(v.cy,v.ty,dt*2)
|
||||
if negdiff(v.cx,v.x) and negdiff(v.cy,v.y) then
|
||||
anims[k]=nil
|
||||
end
|
||||
end
|
||||
local tk={}
|
||||
if running then
|
||||
for x,falling in ipairs(falling) do
|
||||
for fall,_ in pairs(falling) do
|
||||
entc=entc+1
|
||||
fall.vel=fall.vel+dt*gacc
|
||||
fall.y=fall.y+fall.vel*dt
|
||||
local iy=math.floor(fall.y)
|
||||
for fallb,_ in pairs(falling) do
|
||||
if fall~=fallb and inters(
|
||||
fall.y-#fall.figs+1-0.5,fall.y+0.5,
|
||||
fallb.y-#fallb.figs+1-0.5,fallb.y+0.5
|
||||
) and fall.die==fallb.die then
|
||||
local wa,wb=#fall.figs,#fallb.figs
|
||||
fall.vel=(fall.vel*wa+fallb.vel*wb)/(wa+wb)
|
||||
if fallb.y<fall.y then
|
||||
local ff=#fall.figs
|
||||
for i,fig in ipairs(fallb.figs) do
|
||||
fall.figs[ff+i]=fig
|
||||
end
|
||||
else
|
||||
local tt={}
|
||||
for i,fig in ipairs(fall.figs) do
|
||||
tt[i]=fig
|
||||
end
|
||||
for i,fig in ipairs(fallb.figs) do
|
||||
fall.figs[i]=fig
|
||||
end
|
||||
local ff=#fallb.figs
|
||||
for i,fig in ipairs(tt) do
|
||||
fall.figs[ff+i]=fig
|
||||
end
|
||||
fall.y=fallb.y
|
||||
end
|
||||
falling[fallb]=nil
|
||||
end
|
||||
end
|
||||
if board[x][iy+1] or (not fall.die and {iy>=bh} or {iy>=bh+#fall.figs})[1] then
|
||||
falling[fall]=nil
|
||||
if not fall.die then
|
||||
local off=math.min(iy,bh)
|
||||
for i,fig in ipairs(fall.figs) do
|
||||
while board[x][off] do
|
||||
off=off-1
|
||||
end
|
||||
if off<=bh and off>=1 then
|
||||
board[x][off]=fig
|
||||
end
|
||||
off=off-1
|
||||
end
|
||||
for i=off+1,off+#fall.figs do
|
||||
tk[#tk+1]={x,i}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if entc==0 and dying then
|
||||
dying=false
|
||||
running=false
|
||||
fillboard()
|
||||
end
|
||||
local oam,obm,rm={},{},{}
|
||||
for k,v in pairs(tk) do
|
||||
local x,y=unpack(v)
|
||||
check(x,y,rm,oam,obm)
|
||||
end
|
||||
killall(rm)
|
||||
for v,_ in pairs(booms) do
|
||||
boomc=boomc+1
|
||||
v.a=v.a-dt/math.abs(v.a)*4
|
||||
if v.a<=0.01 then
|
||||
booms[v]=nil
|
||||
end
|
||||
end
|
||||
tt=tt+dt
|
||||
end
|
||||
end
|
||||
|
||||
local yes=true
|
||||
|
||||
function love.keypressed(k)
|
||||
local x,y=love.mouse.getPosition()
|
||||
x,y=trans:inverseTransformPoint(x,y)
|
||||
x,y=math.floor(x)+1,math.floor(y)+1
|
||||
x=math.max(1,math.min(bw,x))
|
||||
y=math.max(1,math.min(bh,y))
|
||||
if dbg and tonumber(k) then
|
||||
print(gobjs[tonumber(k)],tonumber(k))
|
||||
board[x][y]=gobjs[tonumber(k)] or board[x][y]
|
||||
end
|
||||
if dbg and isgem(board[x][y]) then
|
||||
local c=board[x][y].c
|
||||
if k=="h" then
|
||||
board[x][y]=cgobjs[c]
|
||||
elseif k=="j" then
|
||||
board[x][y]=lgobjs[c]
|
||||
elseif k=="k" then
|
||||
board[x][y]=mgobjs[c]
|
||||
end
|
||||
end
|
||||
if k=="f2" then
|
||||
yes=not yes
|
||||
elseif k=="f3" then
|
||||
dbg=not dbg
|
||||
elseif k=="f4" then
|
||||
local unfell={}
|
||||
local yls={}
|
||||
local cx=x
|
||||
for x=1,bw do
|
||||
local yl
|
||||
for y=bh,0,-1 do
|
||||
if not board[x][y] then
|
||||
yl=y
|
||||
break
|
||||
end
|
||||
end
|
||||
unfell[x]={}
|
||||
local tt={}
|
||||
for k,v in pairs(falling[x]) do
|
||||
tt[#tt+1]=k
|
||||
end
|
||||
table.sort(tt,function(a,b)
|
||||
return a.y>b.y
|
||||
end)
|
||||
for _,fall in ipairs(tt) do
|
||||
falling[x][fall]=nil
|
||||
for k,v in ipairs(fall.figs) do
|
||||
unfell[x][yl]={board[x][yl]}
|
||||
board[x][yl]=v
|
||||
yl=yl-1
|
||||
end
|
||||
end
|
||||
yls[x]=yl
|
||||
end
|
||||
elseif k=="f5" then
|
||||
slow=not slow
|
||||
elseif k=="f7" then
|
||||
falltest=not falltest
|
||||
elseif k=="f8" then
|
||||
bat=bat*0.25
|
||||
end
|
||||
end
|
||||
|
||||
function love.draw()
|
||||
if dbg then
|
||||
g.push("all")
|
||||
g.scale(2,2)
|
||||
love.graphics.print(("FPS: %i; dt: %.2f; anims: %i; fallings: %i; booms: %i"):format(
|
||||
love.timer.getFPS(),
|
||||
math.floor(love.timer.getDelta()*100000)/100,
|
||||
animc, entc, boomc
|
||||
))
|
||||
g.pop()
|
||||
end
|
||||
local sw,sh=g.getDimensions()
|
||||
local ww=math.min(sw,sh)
|
||||
local y
|
||||
if falltest then
|
||||
ww=math.min(sw,sh)*0.5
|
||||
y=(sh)/2
|
||||
end
|
||||
local x,y=(sw-ww)/2,y or (sh-ww)/2
|
||||
setbsize(x+ww*0.1,y+ww*0.1+ww/bh*0.2,ww*0.8,ww*0.8)
|
||||
if yes then
|
||||
drawboard()
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue