From bef28a8d87cba4836d545e7e40a62a8ec5f4ef4a Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Sat, 31 Dec 2022 14:44:24 -0800 Subject: [PATCH] Fix misc rope bugs --- chameleonic.p8 | 133 +++++++++++++++++++------------------------------ 1 file changed, 52 insertions(+), 81 deletions(-) diff --git a/chameleonic.p8 b/chameleonic.p8 index 9d2ec6c..66c652f 100644 --- a/chameleonic.p8 +++ b/chameleonic.p8 @@ -389,20 +389,12 @@ function level:reanchor() end end - local anch_old=self._anch or {} - for _,old in pairs(anch_old) do - old.dropped=true - end - local moves={} for k,new in pairs(anch_new) do - local old=anch_old[k] + local old=(self._anch or {})[k] if old then - anch_new[k]=old - local ax_old,ay_old - 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 + anch_new[k]=new + if (old.ax!=new.ax or old.ay!=new.ay) add(moves,{old.ax,old.ay,new.ax,new.ay,old,key=k}) end end self._anch=anch_new @@ -412,7 +404,7 @@ function level:reanchor() end shellsort(self._anch_keys) shellsort(moves) - printh("!!STARTING!!") + --printh("!!STARTING!!") if player.rope then player.rope:experience_anchor_moves(moves) @@ -428,14 +420,20 @@ function level:win_at(mx,my) end function level:anchor_points() - local i=0 + -- TODO: Return this to using all() + local keys=all(self._anch_keys) return function() - i+=1 - local k=self._anch_keys[i] + local k=keys() if (k) return self._anch[k.key] 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) local pit=self._pits[_mix(mx,my)] if (pit and not pit.contents) return pit @@ -472,13 +470,10 @@ function level:spawn_exit() end function level:mcoll(mx,my) + if ((mx | my) & 0xFFF0!=0) return true return self._coll[_mix(mx,my)] end -function level:pcoll(px,py) - return self:mcoll(px\8,py\8) -end - function level:get_crate(mx,my) return self._crates[_mix(mx,my)] 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: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 player.rope then @@ -993,32 +987,33 @@ function rope:draw(artificial_px,artificial_py) end -- debug + --[[ local n1=self.src local sy=0 while true do if (n1==nil) break + local anch=level:anchor_at(n1.ax,n1.ay) local x=n1.ax*8 local y=n1.ay*8 - if n1.associated_with then - if (n1.associated_with.adx>0) x-=1 - if (n1.associated_with.ady>0) y-=1 + if anch then + if (anch.adx>0) x-=1 + if (anch.ady>0) y-=1 end rectfill(x-1,y-1,x+1,y+1,12) 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+=14 + sy+=7 local n0=n1.prev local n2=n1.next if n0!=nil and n2!=nil then - if n1.associated_with then - local _,_,_,adx,ady=would_stick(n0.ax,n0.ay,n1.associated_with,n2.ax,n2.ay) + if anch then + 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(ady==-1 or ady==0 or ady==1) --assert(not (adx==0 and ady==0)) 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) pset(x+adx*2,y,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,y+p.ady,11) end + ]] end function rope:drag_dst(x,y) @@ -1058,20 +1054,6 @@ function rope:drag(n1,ax_new,ay_new) end 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 while true do local n1=n0.next @@ -1098,19 +1080,16 @@ function rope:relax() local x1,y1=n1.ax,n1.ay local x2,y2=n2.ax,n2.ay - if n1.associated_with then - local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2) - 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}}) - -- printh("relaxing: "..tostring(n0.associated_with).."->"..tostring(n1.associated_with).."->"..tostring(n2.associated_with)) - self:_drag(n1,x1_new,y1_new,n1.ax,n1.ay) - n0=n1.prev - n2=n1.next - n0.next=n2 - n2.prev=n0 - n1.next=nil - n1.prev=nil - else n0=n0.next end + local anch=level:anchor_at(n1.ax,n1.ay) + 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 + self:_drag(n1,x1_new,y1_new,n1.ax,n1.ay) + n0=n1.prev + n2=n1.next + n0.next=n2 + n2.prev=n0 + n1.next=nil + n1.prev=nil else n0=n0.next end end end @@ -1183,8 +1162,8 @@ function rope:_check_sane() return true end -function would_stick(x0,y0,anchor,x2,y2) - local x1,y1=anchor.ax,anchor.ay +function would_stick(anchor,x0,y0,x1,y1,x2,y2) + if (x1==nil or y1==nil) x1,y1=anchor.ax,anchor.ay local dx=x2-x0 local dy=y2-y0 @@ -1212,7 +1191,7 @@ function would_stick(x0,y0,anchor,x2,y2) if (x0"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) + -- printh("creating: "..tostring{anch,{n0.ax,n0.ay},{n05.ax,n05.ay},{n1.ax,n1.ay}}) + -- printh("dragging: "..tostring{anch,{n05.ax,n05.ay},{ax_new,ay_new}}) + self:_drag(n05,ax_new,ay_new) else n0=n0.next end @@ -1313,7 +1286,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing) if not _uncreatable(anchor) 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_new) @@ -1334,7 +1307,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing) if not _uncreatable(anchor) 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_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 ) if (not anch) break - local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1} - printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) + local n05={ax=anch.ax,ay=anch.ay,prev=n0,next=n1} n0.next=n05 n1.prev=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 ) if (not anch) break - local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2} - printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with)) + local n15={ax=anch.ax,ay=anch.ay,prev=n1,next=n2} n1.next=n15 n2.prev=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), ax=a.ax,ay=a.ay } - local aw=a.associated_with + local aw=level:anchor_at(a.ax,a.ay) local l=self.latch if aw then if (aw.adx==1) point.x-=1