Fix misc rope bugs
This commit is contained in:
parent
cc6efb5e61
commit
bef28a8d87
133
chameleonic.p8
133
chameleonic.p8
@ -389,20 +389,12 @@ function level:reanchor()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local anch_old=self._anch or {}
|
|
||||||
for _,old in pairs(anch_old) do
|
|
||||||
old.dropped=true
|
|
||||||
end
|
|
||||||
|
|
||||||
local moves={}
|
local moves={}
|
||||||
for k,new in pairs(anch_new) do
|
for k,new in pairs(anch_new) do
|
||||||
local old=anch_old[k]
|
local old=(self._anch or {})[k]
|
||||||
if old then
|
if old then
|
||||||
anch_new[k]=old
|
anch_new[k]=new
|
||||||
local ax_old,ay_old
|
if (old.ax!=new.ax or old.ay!=new.ay) add(moves,{old.ax,old.ay,new.ax,new.ay,old,key=k})
|
||||||
ax_old,ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady
|
|
||||||
if (ax_old!=old.ax or ay_old!=old.ay) add(moves,{ax_old,ay_old,new.ax,new.ay,key=k})
|
|
||||||
old.dropped=nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self._anch=anch_new
|
self._anch=anch_new
|
||||||
@ -412,7 +404,7 @@ function level:reanchor()
|
|||||||
end
|
end
|
||||||
shellsort(self._anch_keys)
|
shellsort(self._anch_keys)
|
||||||
shellsort(moves)
|
shellsort(moves)
|
||||||
printh("!!STARTING!!")
|
--printh("!!STARTING!!")
|
||||||
|
|
||||||
if player.rope then
|
if player.rope then
|
||||||
player.rope:experience_anchor_moves(moves)
|
player.rope:experience_anchor_moves(moves)
|
||||||
@ -428,14 +420,20 @@ function level:win_at(mx,my)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function level:anchor_points()
|
function level:anchor_points()
|
||||||
local i=0
|
-- TODO: Return this to using all()
|
||||||
|
local keys=all(self._anch_keys)
|
||||||
return function()
|
return function()
|
||||||
i+=1
|
local k=keys()
|
||||||
local k=self._anch_keys[i]
|
|
||||||
if (k) return self._anch[k.key]
|
if (k) return self._anch[k.key]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function level:anchor_at(ax,ay)
|
||||||
|
for i in self:anchor_points() do
|
||||||
|
if (i.ax==ax and i.ay==ay) return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function level:get_open_pit(mx,my)
|
function level:get_open_pit(mx,my)
|
||||||
local pit=self._pits[_mix(mx,my)]
|
local pit=self._pits[_mix(mx,my)]
|
||||||
if (pit and not pit.contents) return pit
|
if (pit and not pit.contents) return pit
|
||||||
@ -472,13 +470,10 @@ function level:spawn_exit()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function level:mcoll(mx,my)
|
function level:mcoll(mx,my)
|
||||||
|
if ((mx | my) & 0xFFF0!=0) return true
|
||||||
return self._coll[_mix(mx,my)]
|
return self._coll[_mix(mx,my)]
|
||||||
end
|
end
|
||||||
|
|
||||||
function level:pcoll(px,py)
|
|
||||||
return self:mcoll(px\8,py\8)
|
|
||||||
end
|
|
||||||
|
|
||||||
function level:get_crate(mx,my)
|
function level:get_crate(mx,my)
|
||||||
return self._crates[_mix(mx,my)]
|
return self._crates[_mix(mx,my)]
|
||||||
end
|
end
|
||||||
@ -559,7 +554,6 @@ function level:can_move(
|
|||||||
if (is_player and self:win_at(mx1,my1)) return true
|
if (is_player and self:win_at(mx1,my1)) return true
|
||||||
if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned()
|
if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned()
|
||||||
|
|
||||||
if ((mx1 | my1) & 0xFFF0!=0) return false
|
|
||||||
if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return
|
if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return
|
||||||
|
|
||||||
if player.rope then
|
if player.rope then
|
||||||
@ -993,32 +987,33 @@ function rope:draw(artificial_px,artificial_py)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- debug
|
-- debug
|
||||||
|
--[[
|
||||||
local n1=self.src
|
local n1=self.src
|
||||||
local sy=0
|
local sy=0
|
||||||
while true do
|
while true do
|
||||||
if (n1==nil) break
|
if (n1==nil) break
|
||||||
|
local anch=level:anchor_at(n1.ax,n1.ay)
|
||||||
local x=n1.ax*8
|
local x=n1.ax*8
|
||||||
local y=n1.ay*8
|
local y=n1.ay*8
|
||||||
if n1.associated_with then
|
if anch then
|
||||||
if (n1.associated_with.adx>0) x-=1
|
if (anch.adx>0) x-=1
|
||||||
if (n1.associated_with.ady>0) y-=1
|
if (anch.ady>0) y-=1
|
||||||
end
|
end
|
||||||
rectfill(x-1,y-1,x+1,y+1,12)
|
rectfill(x-1,y-1,x+1,y+1,12)
|
||||||
print("ax="..n1.ax..",ay="..n1.ay,72,sy)
|
print("ax="..n1.ax..",ay="..n1.ay,72,sy)
|
||||||
print(tostring(n1.associated_with and (not n1.associated_with.dropped and n1.associated_with.ax==n1.ax and n1.associated_with.ay==n1.ay)),76,sy+7)
|
sy+=7
|
||||||
sy+=14
|
|
||||||
|
|
||||||
local n0=n1.prev
|
local n0=n1.prev
|
||||||
local n2=n1.next
|
local n2=n1.next
|
||||||
if n0!=nil and n2!=nil then
|
if n0!=nil and n2!=nil then
|
||||||
if n1.associated_with then
|
if anch then
|
||||||
local _,_,_,adx,ady=would_stick(n0.ax,n0.ay,n1.associated_with,n2.ax,n2.ay)
|
local _,_,_,adx,ady=would_stick(anch,n0.ax,n0.ay,n1.ax,n1.ay,n2.ax,n2.ay)
|
||||||
assert(adx==-1 or adx==0 or adx==1)
|
assert(adx==-1 or adx==0 or adx==1)
|
||||||
assert(ady==-1 or ady==0 or ady==1)
|
assert(ady==-1 or ady==0 or ady==1)
|
||||||
--assert(not (adx==0 and ady==0))
|
--assert(not (adx==0 and ady==0))
|
||||||
|
|
||||||
local c=3
|
local c=3
|
||||||
if (n1.associated_with.dropped) c=4
|
if (anch.dropped) c=4
|
||||||
rectfill(x+2,y+2,x+4,y+4,c)
|
rectfill(x+2,y+2,x+4,y+4,c)
|
||||||
pset(x+adx*2,y,9)
|
pset(x+adx*2,y,9)
|
||||||
pset(x,y+ady*2,9)
|
pset(x,y+ady*2,9)
|
||||||
@ -1040,6 +1035,7 @@ function rope:draw(artificial_px,artificial_py)
|
|||||||
pset(x+p.adx,y,11)
|
pset(x+p.adx,y,11)
|
||||||
pset(x,y+p.ady,11)
|
pset(x,y+p.ady,11)
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
function rope:drag_dst(x,y)
|
function rope:drag_dst(x,y)
|
||||||
@ -1058,20 +1054,6 @@ function rope:drag(n1,ax_new,ay_new)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function rope:relax()
|
function rope:relax()
|
||||||
local n0=self.src
|
|
||||||
while n0 do
|
|
||||||
if n0.associated_with and n0.associated_with.dropped then
|
|
||||||
for i in level:anchor_points() do
|
|
||||||
if i.ax==n0.ax and i.ay==n0.ay then
|
|
||||||
n0.associated_with=i
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
n0=n0.next
|
|
||||||
end
|
|
||||||
|
|
||||||
local n0=self.src
|
local n0=self.src
|
||||||
while true do
|
while true do
|
||||||
local n1=n0.next
|
local n1=n0.next
|
||||||
@ -1098,19 +1080,16 @@ function rope:relax()
|
|||||||
local x1,y1=n1.ax,n1.ay
|
local x1,y1=n1.ax,n1.ay
|
||||||
local x2,y2=n2.ax,n2.ay
|
local x2,y2=n2.ax,n2.ay
|
||||||
|
|
||||||
if n1.associated_with then
|
local anch=level:anchor_at(n1.ax,n1.ay)
|
||||||
local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2)
|
local would,x1_new,y1_new=would_stick(anch,x0,y0,x1,y1,x2,y2)
|
||||||
if not would and not (n1.ax==x1_new and n1.ay==y1_new) then
|
if not would and not (n1.ax==x1_new and n1.ay==y1_new) then
|
||||||
-- printh("dragging: "..tostring{n1.associated_with, {x1_new, y1_new}})
|
self:_drag(n1,x1_new,y1_new,n1.ax,n1.ay)
|
||||||
-- printh("relaxing: "..tostring(n0.associated_with).."->"..tostring(n1.associated_with).."->"..tostring(n2.associated_with))
|
n0=n1.prev
|
||||||
self:_drag(n1,x1_new,y1_new,n1.ax,n1.ay)
|
n2=n1.next
|
||||||
n0=n1.prev
|
n0.next=n2
|
||||||
n2=n1.next
|
n2.prev=n0
|
||||||
n0.next=n2
|
n1.next=nil
|
||||||
n2.prev=n0
|
n1.prev=nil
|
||||||
n1.next=nil
|
|
||||||
n1.prev=nil
|
|
||||||
else n0=n0.next end
|
|
||||||
else n0=n0.next end
|
else n0=n0.next end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1183,8 +1162,8 @@ function rope:_check_sane()
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
function would_stick(x0,y0,anchor,x2,y2)
|
function would_stick(anchor,x0,y0,x1,y1,x2,y2)
|
||||||
local x1,y1=anchor.ax,anchor.ay
|
if (x1==nil or y1==nil) x1,y1=anchor.ax,anchor.ay
|
||||||
|
|
||||||
local dx=x2-x0
|
local dx=x2-x0
|
||||||
local dy=y2-y0
|
local dy=y2-y0
|
||||||
@ -1212,7 +1191,7 @@ function would_stick(x0,y0,anchor,x2,y2)
|
|||||||
if (x0<x2) ady=-adx
|
if (x0<x2) ady=-adx
|
||||||
end
|
end
|
||||||
|
|
||||||
local wouldnt=anchor.dropped or (anchor.adx!=adx or anchor.ady!=ady)
|
local wouldnt=anchor==nil or (anchor.adx!=adx or anchor.ady!=ady)
|
||||||
|
|
||||||
return not wouldnt,x1_new,y1_new,adx,ady
|
return not wouldnt,x1_new,y1_new,adx,ady
|
||||||
end
|
end
|
||||||
@ -1246,7 +1225,7 @@ function rope:_be_pushed_by(moves)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function rope:_be_pushed_by1(ax_old,ay_old,ax_new,ay_new)
|
function rope:_be_pushed_by1(ax_old,ay_old,ax_new,ay_new,anch)
|
||||||
local n0=self.src
|
local n0=self.src
|
||||||
while true do
|
while true do
|
||||||
n1=n0.next
|
n1=n0.next
|
||||||
@ -1255,38 +1234,32 @@ function rope:_be_pushed_by1(ax_old,ay_old,ax_new,ay_new)
|
|||||||
local nx0,ny0=n0.ax,n0.ay
|
local nx0,ny0=n0.ax,n0.ay
|
||||||
local nx1,ny1=n1.ax,n1.ay
|
local nx1,ny1=n1.ax,n1.ay
|
||||||
|
|
||||||
printh(tostring{nx0,ny0,nx1,ny1})
|
|
||||||
local nxmn,nxmx = _mnmx(nx0,nx1)
|
local nxmn,nxmx = _mnmx(nx0,nx1)
|
||||||
local nymn,nymx = _mnmx(ny0,ny1)
|
local nymn,nymx = _mnmx(ny0,ny1)
|
||||||
-- printh(tostring({anchor,nxmn,nxmx,nymn,nymx}))
|
|
||||||
|
|
||||||
if
|
if
|
||||||
(ax_new!=ax_old or (nxmn<=ax_new and ax_new<=nxmx)) and
|
(ax_new!=ax_old or (nxmn<ax_new and ax_new<nxmx)) and
|
||||||
(ay_new!=ay_old or (nymn<=ay_new and ay_new<=nymx)) and
|
(ay_new!=ay_old or (nymn<ay_new and ay_new<nymx)) and
|
||||||
|
|
||||||
(_which_side(ax_old,ay_old,nx0,ny0,nx1,ny1)!=
|
(_which_side(ax_old,ay_old,nx0,ny0,nx1,ny1)!=
|
||||||
_which_side(ax_new,ay_new,nx0,ny0,nx1,ny1)
|
_which_side(ax_new,ay_new,nx0,ny0,nx1,ny1)
|
||||||
) and would_stick(nx0,ny0,{ax=ax_new,ay=ay_new},nx1,ny1)
|
) and would_stick(anch,nx0,ny0,nil,nil,nx1,ny1)
|
||||||
then
|
then
|
||||||
-- printh("found (in): "..tostring({{nx0,ny0},{nx1,ny1}, anchor}))
|
|
||||||
local nx05,ny05
|
local nx05,ny05
|
||||||
if ax_new==ax_old then
|
if ax_new==ax_old then
|
||||||
nx05=anchor.ax
|
nx05=ax_new
|
||||||
ny05=ny0+(nx05-nx0)/(nx1-nx0) * (ny1-ny0)
|
ny05=ny0+(nx05-nx0)/(nx1-nx0) * (ny1-ny0)
|
||||||
-- printh("found (x): "..tostring({nx05,ny05}))
|
|
||||||
elseif ay_new==ay_old then
|
elseif ay_new==ay_old then
|
||||||
ny05=anchor.ay
|
ny05=ay_new
|
||||||
nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0)
|
nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0)
|
||||||
-- printh("found (y): "..tostring({nx05,ny05}))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local n05={ax=nx05,ay=ny05,associated_with=anchor,prev=n0,next=n1}
|
local n05={ax=nx05,ay=ny05,prev=n0,next=n1}
|
||||||
--printh("adding: "..tostring({nx05,ny05,anchor}))
|
|
||||||
n0.next=n05
|
n0.next=n05
|
||||||
n1.prev=n05
|
n1.prev=n05
|
||||||
self:_drag(n05,anchor.ax,anchor.ay)
|
-- printh("creating: "..tostring{anch,{n0.ax,n0.ay},{n05.ax,n05.ay},{n1.ax,n1.ay}})
|
||||||
-- printh("dragged: "..tostring({n05.ax,n05.ay,anchor}))
|
-- printh("dragging: "..tostring{anch,{n05.ax,n05.ay},{ax_new,ay_new}})
|
||||||
-- printh("local: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with))
|
self:_drag(n05,ax_new,ay_new)
|
||||||
else
|
else
|
||||||
n0=n0.next
|
n0=n0.next
|
||||||
end
|
end
|
||||||
@ -1313,7 +1286,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
|
|||||||
if
|
if
|
||||||
not _uncreatable(anchor) and
|
not _uncreatable(anchor) and
|
||||||
(ax0<=anchor.ax and anchor.ax<=ax1) and
|
(ax0<=anchor.ax and anchor.ax<=ax1) and
|
||||||
would_stick(ax_pivot,ay_pivot,anchor,ax_far,ay_far_new) and
|
would_stick(anchor,ax_pivot,ay_pivot,nil,nil,ax_far,ay_far_new) and
|
||||||
(
|
(
|
||||||
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old) !=
|
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old) !=
|
||||||
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_new)
|
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_new)
|
||||||
@ -1334,7 +1307,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
|
|||||||
if
|
if
|
||||||
not _uncreatable(anchor) and
|
not _uncreatable(anchor) and
|
||||||
(ay0<=anchor.ay and anchor.ay<=ay1) and
|
(ay0<=anchor.ay and anchor.ay<=ay1) and
|
||||||
would_stick(ax_pivot,ay_pivot,anchor,ax_far_new,ay_far) and
|
would_stick(anchor,ax_pivot,ay_pivot,nil,nil,ax_far_new,ay_far) and
|
||||||
(
|
(
|
||||||
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far) !=
|
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far) !=
|
||||||
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_new,ay_far)
|
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_new,ay_far)
|
||||||
@ -1359,8 +1332,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
|
|||||||
n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new
|
n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new
|
||||||
)
|
)
|
||||||
if (not anch) break
|
if (not anch) break
|
||||||
local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1}
|
local n05={ax=anch.ax,ay=anch.ay,prev=n0,next=n1}
|
||||||
printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with))
|
|
||||||
n0.next=n05
|
n0.next=n05
|
||||||
n1.prev=n05
|
n1.prev=n05
|
||||||
n0=n05
|
n0=n05
|
||||||
@ -1373,8 +1345,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
|
|||||||
n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new
|
n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new
|
||||||
)
|
)
|
||||||
if (not anch) break
|
if (not anch) break
|
||||||
local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2}
|
local n15={ax=anch.ax,ay=anch.ay,prev=n1,next=n2}
|
||||||
printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with))
|
|
||||||
n1.next=n15
|
n1.next=n15
|
||||||
n2.prev=n15
|
n2.prev=n15
|
||||||
n2=n15
|
n2=n15
|
||||||
@ -1660,7 +1631,7 @@ function rope:_anchors_simplified()
|
|||||||
x=flr(a.ax*8+0.5),y=flr(a.ay*8+0.5),
|
x=flr(a.ax*8+0.5),y=flr(a.ay*8+0.5),
|
||||||
ax=a.ax,ay=a.ay
|
ax=a.ax,ay=a.ay
|
||||||
}
|
}
|
||||||
local aw=a.associated_with
|
local aw=level:anchor_at(a.ax,a.ay)
|
||||||
local l=self.latch
|
local l=self.latch
|
||||||
if aw then
|
if aw then
|
||||||
if (aw.adx==1) point.x-=1
|
if (aw.adx==1) point.x-=1
|
||||||
|
Loading…
Reference in New Issue
Block a user