diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..3028f0b --- /dev/null +++ b/conf.lua @@ -0,0 +1,4 @@ +function love.conf(t) + t.width=400 + t.height=400 +end diff --git a/main.lua b/main.lua index 645eb69..2619369 100644 --- a/main.lua +++ b/main.lua @@ -67,9 +67,21 @@ local tt=0 local bat=1 local batd=bat local score=0 +local tochar=0 local scored=score local function znoise(...) return love.math.noise(...)*2-1 +end +local function eudist(x,y) + return (x*x+y*y)^0.5 +end +local function norm(x1,y1) + local d=eudist(x,y) + if d==0 then return 0,0 end + return x/d,y/d +end +local function dlbolt(x,y,x1,y1) + end local function drawfig(n,a) g.push("all") @@ -133,7 +145,12 @@ end local gemrng local function randgem() - local objl=gemrng:random()>0.99 and cgobjs or gobjs + tochar=tochar-1 + local objl=gobjs + if tochar<=0 then + tochar=gemrng:random((bw*bh)*0.5,(bw*bh)*1.5) + objl=cgobjs + end return objl[gemrng:random(math.floor(cc))] end local function nextgem(o) @@ -163,11 +180,11 @@ local function badboigemcheck(c,am,ac,rm) local rc=ac==5 and mgobjs[c] or lgobjs[c] rm[e][3]=rc end -local function megascan(c,rm) +local function megascan(x,y,c,rm) local ogc=c - if not isgem(ogc) then return end rm=rm or {} - if ogc.super~="color" then return end + if not isgem(ogc) then return next(rm) and rm end + if ogc.super~="color" then return next(rm) and rm end for x=1,bw do for y=1,bh do local i=pti(x,y) @@ -180,7 +197,7 @@ local function megascan(c,rm) end local function check(x,y,rm,oam,obm) local c=board[x][y] - if not c then return end + if not c then return rm,oam,obm end local ac,bc=1,1 local am,bm={},{} oam,obm=oam or {}, obm or {} @@ -413,27 +430,45 @@ killall=function(kills,b,...) 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} + local seen={} + local news=true + while news do + news=false + local ko + kills,ko={},kills + for k,v in pairs(ko) do + kills[k]=v + if not seen[k] then + local x,y=unpack(v) + local c=board[v[1]][v[2]] + seen[k]=true + if isgem(c) and c.super=="lines" then + for x=1,bw do + local i=pti(x,y) + if board[x][y] and not kills[i] then + news=true + kills[i]={x,y} + end + end + for y=1,bh do + local i=pti(x,y) + if board[x][y] and not kills[i] then + news=true + kills[i]={x,y} + end + end + end + if isgem(c) then + local mks={} + megascan(x,y,c,mks) + for k,v in pairs(mks) do + if not kills[k] then + kills[k]=v + news=true + end + end 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 @@ -488,6 +523,7 @@ local function fillboard() score=0 bat=1 gemrng=love.math.newRandomGenerator(991) + tochar=bw*bh+gemrng:random(bw) for x=1,bw do board[x]={} for y=1,bh do @@ -513,6 +549,7 @@ local function fillboard() dropall(-bh) end local dbg=false +local playdbg=false function love.load() fillboard() @@ -557,8 +594,9 @@ function love.mousereleased(x,y,b) 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 kills=check(ix,iy,check(px,py)) + if kills and board[ix][iy] and board[px][py] then + megascan(ix,iy,board[ix][iy],megascan(px,py,board[px][py],kills)) local ii,pi=pti(ix,iy),pti(px,py) local ania,anib=anims[ii],anims[pi] anims[ii],anims[pi]=anib,ania @@ -613,19 +651,41 @@ end local animc=0 local entc=0 local boomc=0 -local slow=false +local slow=1 local accumdt=0 local tps=120 +local speeds={1,0.05,10} function love.update(dt) - dt=math.min(dt,0.2)*(slow and 0.05 or 1) - accumdt=accumdt+dt + dt=math.min(dt,0.2)*(speeds[slow]) + accumdt=math.min(1,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 and playdbg then + for _=1,10 do + local ix,iy=math.random(1,bw),math.random(1,bh) + local px,py=0,0 + while px<1 or py<1 or px>bw or py>bh do + local ox,oy=unpack(({{1,0},{-1,0},{0,1},{0,-1}})[math.random(1,4)]) + px,py=ix+ox,iy+oy + end + board[ix][iy],board[px][py]= + board[px][py],board[ix][iy] + local kills=check(ix,iy,check(px,py)) + if kills and board[ix][iy] and board[px][py] then + megascan(ix,iy,board[ix][iy],megascan(px,py,board[px][py],kills)) + killall(kills) + break + else + board[ix][iy],board[px][py]= + board[px][py],board[ix][iy] + end + end + end if running then bat=math.max(0,bat-dt*0.015*(math.max(bat,0.0625)^0.5)) end @@ -806,11 +866,15 @@ function love.keypressed(k) yls[x]=yl end elseif k=="f5" then - slow=not slow + slow=slow%3+1 elseif k=="f7" then falltest=not falltest elseif k=="f8" then bat=bat*0.25 + elseif k=="f9" then + bat=bat*2 + elseif k=="f10" then + playdbg=not playdbg end end @@ -818,9 +882,10 @@ 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.graphics.print(("FPS: %i; dt: %.2f; speed: %f; anims: %i; fallings: %i; booms: %i"):format( love.timer.getFPS(), math.floor(love.timer.getDelta()*100000)/100, + speeds[slow], animc, entc, boomc )) g.pop()