Misc additional rope physics changes

This commit is contained in:
Pyrex 2022-12-19 18:01:02 -08:00
parent 40859065df
commit 74ac91fdeb

View File

@ -337,6 +337,15 @@ function level:recollide()
end
end
function add_adjacent_anchors(tbl,mx,my)
for ax in all{mx*2-1,mx*2+2} do
for ay in all{my*2-1,my*2+2} do
local px,py=level:a2p(ax,ay)
tbl[_amix(ax,ay)]={ax=ax0,ay=ay0,x=px,y=py}
end
end
end
function level:reanchor(remove)
if remove or not self._anch then
self._anch={}
@ -362,12 +371,7 @@ function level:reanchor(remove)
end
for _,cr in pairs(self._crates) do
for ax in all{cr.mx*2-1,cr.mx*2+2} do
for ay in all{cr.my*2-1,cr.my*2+2} do
local px,py=self:a2p(ax,ay)
self._anch[_amix(ax,ay)]={ax=ax0,ay=ay0,x=px,y=py}
end
end
add_adjacent_anchors(self._anch,cr.mx,cr.my)
end
if (player.rope!=nil) player.rope:make_dirty()
@ -1034,29 +1038,29 @@ function rope:drag(
a.y=y
a.dirty=true
self.dirty=true
--self:_find_needed_anchors(i())
--self:_find_needed_anchors(i()+1)
if (not busy) self:_tidy_up_gen()
end
end
end
function rope:make_dirty()
for a=0,#self.ancs+1 do
self:_anc(a).dirty=true
function rope:make_dirty(only_if_invalid)
local invalid=false
for a=0,#self.ancs do
local a0=self:_anc(a)
local a1=self:_anc(a+1)
if not self:_can_stretch(a0,a1) then
a0.dirty=true
a1.dirty=true
invalid=true
end
self.dirty=true
end
if (invalid or not only_if_invalid) self.dirty=true
end
function rope:_tidy_up_gen()
local invalid=false
for i=0,#self.ancs do
local a0=self:_anc(i)
local a1=self:_anc(i+1)
if not self:_can_stretch(a0,a1) then
invalid=true
break
end
end
if (invalid) self:make_dirty()
self:make_dirty(true)
local busy=self:busy()
if (not self:latched()) return
@ -1131,7 +1135,7 @@ function rope:_tidy_up_gen()
self.dirty=false
end
function rope:_find_needed_anchors(i)
function rope:_find_needed_anchors(i,busy)
if (i<=0) return false
if (#self.ancs+1<i) return false
@ -1376,7 +1380,7 @@ function rope:_rast(
if (x==x1) done=true return x1,y1
local oldx,oldy=x,y
err-=dy
if (err<0) y+=sy err+=dx
if (err<0) y+=sy err+=dx+dy return oldx,y
x+=sx
return oldx,oldy
end
@ -1387,7 +1391,7 @@ function rope:_rast(
if (y==y1) done=true return x1,y1
local oldx,oldy=x,y
err-=dx
if (err<0) x+=sx err+=dy
if (err<0) x+=sx err+=dy+dx return x,oldy
y+=sy
return oldx,oldy
end
@ -1444,16 +1448,12 @@ function rope:_tug(hypothetically)
for i=#ancs-1,2,-1 do
local ops_before_trash,hit_end1=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2])
local ops_to_do,corners={},{}
local ops_to_do,corners={}
if #ops_before_trash>0 then
ops_to_do=ops_before_trash
corners[i-1]=true
corners[i]=hit_end1
else
local ops_after_trash,hit_end2=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1])
ops_to_do=ops_after_trash
corners[i-1]=true
corners[i]=hit_end1
end
local ops=ops_to_do
@ -1462,10 +1462,10 @@ function rope:_tug(hypothetically)
if (hypothetically) return ancs,i-1
local dmx,dmy=ops[1].dmx,ops[1].dmy
local adjacent_ancs={}
for o in all(ops) do
level:tug_crate(
o.mx,o.my,dmx,dmy
)
add_adjacent_anchors(adjacent_ancs,o.mx,o.my)
level:tug_crate(o.mx,o.my,o.dmx,o.dmy)
end
for node=ancs[i-1].ix,ancs[i].ix do
local anc=self:_anc(node)
@ -1483,7 +1483,8 @@ function rope:_tug(hypothetically)
end}
end
local dmxh,dmyh=dmx,dmy
if (not corners[node]) dmxh,dmyh=0,0
local ax,ay=level:p2a(x0,y0)
if (adjacent_ancs[_amix(ax,ay)]==nil) dmxh,dmyh=0,0
anc.todo={
{},
upd(x0+dmxh*2,y0+dmyh*2),
@ -1857,7 +1858,7 @@ __map__
0c000000000000000c0c0c0c0c0c0c0c0c00000000000020210000000000000c00000000000e00000e0e0000000000000e0000000000000e0e0e0000000000000e000000000e0e0e0e0e0000000000000e00000000000e0000000000000000000e00000000000e0e0e000000000000000e000000000000000e00000000000000
0c0c0c0c0c0c00000000000c0c0c0c0c0c00000000000030310000000000000c000000000000000e0e000000000000000e00000000000000000e0000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e00000000000e00000e0000000000000e0000000000000e0000000000000000
0c00000000000c0c004f000c0c0c0c0c0c00000000000000000000000000000c0000000000000e0e00000000000000000e00000000000e0e0e0e0000000000000e0000000000000e00000000000000000e000000000000000e000000000000000e0000000000000e0e000000000000000e0000000000000e0000000000000000
0c00000c4f00000c00000000000000120100000000000000000000000000000c00000000000e0e0e0e0e0000000000000e0000000000000000000000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c00000c4f00000000000000000000120100000000000000000000000000000c00000000000e0e0e0e0e0000000000000e0000000000000000000000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e0000000000000000000000000000000e000000000000000000000000000000
3d0000000000003f0c000c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
010000000000000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000