Compare commits

..

2 Commits

Author SHA1 Message Date
78f0a96529
calc_push op loop golf
Reorganizing conditionals saves tokens here.
2023-01-02 15:58:23 -08:00
d792831370
can_move also takes a rope operation table
this is approximately token-neutral but performance-saving. each function parameter makes its call cost worse. When can_move is called inside a loop, we already have a table and we unpack to call can_move; moving the unpack into can_move saves us marshalling cost. It requires us to construct a table in a different spot (where we were not previously doing so) but that spot is not in a loop.
2023-01-02 15:57:27 -08:00

View File

@ -633,10 +633,12 @@ end
ropecheck=split"-0.6,0.4,0.4" ropecheck=split"-0.6,0.4,0.4"
-- argument "o" is a rope operation:
-- array of [mx0,my0,dmx,dmy]
function level:can_move( function level:can_move(
is_player, is_player,o,exclude_src,exclude_dst
mx0,my0,dmx,dmy,exclude_src,exclude_dst
) )
local mx0,my0,dmx,dmy=unpack(o)
local mx1,my1=mx0+dmx,my0+dmy local mx1,my1=mx0+dmx,my0+dmy
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()
@ -652,7 +654,8 @@ function level:can_move(
return true return true
end end
-- argument is array-like: mx0,my0,dmx,dmy -- argument is a rope operation:
-- array of [mx0,my0,dmx,dmy]
function level:tug_crate(t) function level:tug_crate(t)
local mx0,my0,dmx,dmy=unpack(t) local mx0,my0,dmx,dmy=unpack(t)
local mxy0=_mix{mx0,my0} local mxy0=_mix{mx0,my0}
@ -736,7 +739,7 @@ function player:update()
else else
local x,y=self.x,self.y local x,y=self.x,self.y
local function try_move(dx,dy,f) local function try_move(dx,dy,f)
if level:can_move(true,x,y,dx,dy,0,2) then if level:can_move(true,{x,y,dx,dy},0,2) then
self.todo=f self.todo=f
self.cooldown=3 self.cooldown=3
local t=f[#f] local t=f[#f]
@ -1604,7 +1607,7 @@ function rope:_tug(hypothetically)
if not invalid_move then if not invalid_move then
local mv = {mx0,my0,dmx,dmy} local mv = {mx0,my0,dmx,dmy}
if level:can_move(false,mx0,my0,dmx,dmy,1,0) then if level:can_move(false,mv,1,0) then
if (hypothetically) return ancs,0,{mv},blocks if (hypothetically) return ancs,0,{mv},blocks
level:tug_crate(mv) level:tug_crate(mv)
@ -1687,17 +1690,11 @@ function rope:_calc_push(
local ops2,blocked={},{} local ops2,blocked={},{}
for o in all(ops) do for o in all(ops) do
local mx,my,dmx,dmy=unpack(o) local mx,my=unpack(o)
if not level:mcoll(mx,my) then if level:mcoll(mx,my)
-- great! if not (level:get_crate(mx, my)) break
else if not level:can_move(false,o,0,0) then
local crate=level:get_crate(mx,my) add(blocked,o)
if crate then
if not level:can_move(false,mx,my,dmx,dmy,0,0) then
add(blocked,o)
break
end
else
break break
end end
add(ops2,o) add(ops2,o)