diff --git a/chameleonic.p8 b/chameleonic.p8 index efd6ae6..11ed61c 100644 --- a/chameleonic.p8 +++ b/chameleonic.p8 @@ -994,7 +994,7 @@ function rope:affected_src_xy(artificial_px,artificial_py) end function rope:draw(artificial_px,artificial_py) - local points,highlight,hypo_ops=self:_tug(true) + local points,highlight,hypo_ops,hypo_blocks=self:_tug(true) local n,perc_to_show,from_end = self.state.name,1.0 if (n=="done") return if (n=="cast") perc_to_show=self.state.frame/2 @@ -1066,11 +1066,17 @@ function rope:draw(artificial_px,artificial_py) -- hypothetical local time=t()-self.flicker_t - if n=="latched" and time>0 and time%0.5>0.25 and not level:busy() then - for o in all(hypo_ops) do - local mx0,my0,dmx,dmy=unpack(o) - local px1,py1=(mx0+dmx)*8,(my0+dmy)*8 - spr(14,px1,py1) + if n=="latched" and time>0 and not level:busy() then + if time%0.5>0.25 then + for o in all(hypo_ops) do + local mx0,my0,dmx,dmy=unpack(o) + local px1,py1=(mx0+dmx)*8,(my0+dmy)*8 + spr(14,px1,py1) + end + end + for o in all(hypo_blocks) do + local x,y,dx,dy=unpack(o) + spr(53,8*x+4*dx,8*y+4*dy,1,1,time%0.5>0.25) end end @@ -1531,20 +1537,23 @@ function rope:_tug(hypothetically) local ancs=self:_anchors_simplified() local touched={} + local blocks = {} for i=#ancs-1,2,-1 do - local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) + local ops_before_trash,blocks_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) local ops_to_do,corners={} + for b in all(blocks_before_trash) do add(blocks, b) end if #ops_before_trash>0 then - ops_to_do=ops_before_trash + ops_to_do=ops_before_trash else - local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) + local ops_after_trash,blocks_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) ops_to_do=ops_after_trash + for b in all(blocks_after_trash) do add(blocks,b) end end local ops=ops_to_do if #ops>0 then - if (hypothetically) return ancs,i-1,ops + if (hypothetically) return ancs,i-1,ops,blocks for o in all(ops) do level:tug_crate(unpack(o)) end return true @@ -1553,7 +1562,7 @@ function rope:_tug(hypothetically) local latch=self.latch if latch and latch.el=="eyehook" then - if (hypothetically) return ancs,0,{} + if (hypothetically) return ancs,0,{},blocks player.todo={{ update=function(s) if not s.rope or s.rope:done() then @@ -1594,17 +1603,19 @@ function rope:_tug(hypothetically) invalid_move=true end - if not invalid_move and - level:can_move(false,mx0,my0,dmx,dmy,1,0) - then - if (hypothetically) return ancs,0,{{mx0,my0,dmx,dmy}} + if not invalid_move then + if level:can_move(false,mx0,my0,dmx,dmy,1,0) then + if (hypothetically) return ancs,0,{{mx0,my0,dmx,dmy}},blocks - level:tug_crate(mx0,my0,dmx,dmy) - return true + level:tug_crate(mx0,my0,dmx,dmy) + return true + else + add(blocks, {mx0,my0,dmx,dmy}) + end end end - if (hypothetically) return ancs + if (hypothetically) return ancs,0,{},blocks return end @@ -1674,7 +1685,7 @@ function rope:_calc_push( end end - local ops2={} + local ops2,blocked={},{} for o in all(ops) do local mx,my,dmx,dmy=unpack(o) if not level:mcoll(mx,my) then @@ -1683,6 +1694,7 @@ function rope:_calc_push( local crate=level:get_crate(mx,my) if crate then if not level:can_move(false,mx,my,dmx,dmy,0,0) then + add(blocked,o) break end else @@ -1691,7 +1703,7 @@ function rope:_calc_push( add(ops2,o) end end - return ops2 + return ops2,blocked end function rope:_anchors_simplified() @@ -1973,10 +1985,10 @@ eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffff 000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 -00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 -00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 -00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 -0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999 +00000000990000006060000000000000000bc0000090020000000000000000000000000000000000000000000000000019977991999999911999999119999999 +00000000090000005005000000bbcc00000bc0000009200000000000000000000000000000000000000000000000000019911991999117111991199111711999 +00000000aa0000000000000000ccbb00000cb0000002900000000000000000000000000000000000000000000000000019911991999117111991199111711999 +0000000077a000000000000000000000000cb0000020090000000000000000000000000000000000000000000000000019999991999999911997799119999999 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999 00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111 44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 @@ -2206,7 +2218,7 @@ __label__ 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 __gff__ -000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000808080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000 +000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000000080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d